main.py 2.9 KB

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