main.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from pydoc import HTMLDoc
  2. from fastapi import FastAPI
  3. import dataset
  4. import sys
  5. import os
  6. import time
  7. from fastapi.middleware.cors import CORSMiddleware
  8. from fastapi.staticfiles import StaticFiles
  9. from pydantic import BaseModel
  10. from fastapi import FastAPI, Form
  11. import subprocess
  12. import suggests
  13. from typing import Optional
  14. import networkx as nx
  15. import pyvis
  16. import time
  17. from pyvis.network import Network
  18. import pickle
  19. import logging
  20. import threading
  21. import time
  22. import random
  23. import string
  24. from fastapi.responses import HTMLResponse
  25. from fastapi.responses import RedirectResponse
  26. def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
  27. return ''.join(random.choice(chars) for _ in range(size))
  28. app = FastAPI()
  29. origins = ["*"]
  30. app.add_middleware(
  31. CORSMiddleware,
  32. allow_origins=origins,
  33. allow_credentials=True,
  34. allow_methods=["*"],
  35. allow_headers=["*"],
  36. )
  37. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/gtrends?charset=utf8mb4')
  38. app.mount("/web", StaticFiles(directory="static"), name="static")
  39. def thread_function(kw):
  40. global db
  41. print(kw)
  42. G = nx.Graph()
  43. for k in kw:
  44. s = suggests.suggests.get_suggests(k, source='google')
  45. for sg in s['suggests']:
  46. G.add_edge(k,sg,weight=1)
  47. print(sg)
  48. time.sleep(1)
  49. s2 = suggests.suggests.get_suggests(k, source='google')
  50. for elmt in s2['suggests']:
  51. G.add_edge(sg,elmt,weight=1)
  52. G.remove_nodes_from(list(nx.isolates(G)))
  53. G.remove_edges_from( list(nx.selfloop_edges(G)))
  54. # pickle.dump( G, open( "gs2.p", "wb" ) )
  55. pyG = Network(height="750px", width="100%",bgcolor="#333333",font_color="white")
  56. pyG.from_nx(G)
  57. id=id_generator()
  58. db['gen_graph'].insert({'filename':str(id),'kw':str(kw)})
  59. # pyG.save_graph('gstest')
  60. # pyG.show('static/gs/'+str(id)+'.html')
  61. pyG.save_graph('static/gs/'+str(id)+'.html')
  62. @app.get("/tree_list/",response_class=HTMLResponse)
  63. async def tree_list():
  64. # global db
  65. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/gtrends?charset=utf8mb4')
  66. html="<html><body><h2>清單</h2></br>請一分鐘後refresh </br></br>"
  67. html+="<table border='1'>"
  68. cursor=db.query('select filename,kw from gen_graph order by id desc')
  69. cnt=0
  70. for c in cursor:
  71. html+="<tr><td>"+c['kw']+"</td>"
  72. html+="<td><a href='/web/gs/"+c['filename']+".html'>"+c['filename']+"</a></td></tr>"
  73. cnt+=1
  74. if cnt > 10:
  75. break
  76. html+="</table></body></html>"
  77. return html
  78. #response_class=RedirectResponse
  79. @app.post("/gen_tree/",response_class=HTMLResponse)
  80. async def func_expand(kw: str = Form(...),kw2:Optional[str] = Form(None),kw3:Optional[str] = Form(None),kw4:Optional[str] = Form(None) ):
  81. kwlst=[]
  82. if len(kw)>1:
  83. kwlst.append(kw)
  84. if kw2 is not None:
  85. kwlst.append(kw2)
  86. if kw3 is not None:
  87. kwlst.append(kw3)
  88. if kw4 is not None:
  89. kwlst.append(kw4)
  90. x = threading.Thread(target=thread_function, args=(kwlst,))
  91. x.start()
  92. # return "ok"
  93. return RedirectResponse(url="/tree_list",status_code=302)
  94. # return HTMLResponse('<html><head><meta http-equiv="refresh" content="0; URL="/tree_list" /></head></html>')