main.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import rpyc
  2. import time
  3. from fastapi import FastAPI
  4. import sys
  5. import os
  6. import dataset
  7. import requests
  8. import datetime
  9. import json
  10. import ast
  11. from fastapi.responses import JSONResponse, FileResponse
  12. from fastapi.middleware.cors import CORSMiddleware
  13. from pydantic import BaseModel
  14. #from googlesearch import search
  15. import asyncio
  16. import time
  17. from google.ads.googleads.client import GoogleAdsClient
  18. sys.path.append('.')
  19. import kw_planner
  20. import uvicorn
  21. fake_rank_plus = 700
  22. fake_traffic_weighted = 1.3
  23. app = FastAPI()
  24. origins = [
  25. "http://www.googo.org",
  26. "http://www.googo.org:8080",
  27. "http://0.0.0.0:8080",
  28. "http://googo.org:8080",
  29. "http://googo.org",
  30. "http://139.162.121.30"
  31. ]
  32. #uvicorn main:app --host 0.0.0.0 --port 8001
  33. app.add_middleware(
  34. CORSMiddleware,
  35. allow_origins=origins,
  36. allow_credentials=True,
  37. allow_methods=["*"],
  38. allow_headers=["*"],
  39. )
  40. class q_req(BaseModel):
  41. domain_name: str
  42. class kw_req(BaseModel):
  43. keyword: str
  44. def fake_traffic(jsdict):
  45. print('im here')
  46. jsdict['totalVisits'] = jsdict['totalVisits']*fake_traffic_weighted
  47. for k,v in jsdict['EstimatedMonthlyVisits'].items():
  48. jsdict['EstimatedMonthlyVisits'][k]=int(float(v)*fake_traffic_weighted)
  49. jsdict['CountryRank']-=fake_rank_plus
  50. jsdict['GlobalRank']-=fake_rank_plus*66
  51. return jsdict
  52. def get_domain_data(raw_domain):
  53. return jsdict
  54. def domain_filter(url_array):
  55. exclude_list = ['facebook','youtube','twitter','linkedin','instagram','wiki']
  56. list_filted = []
  57. for url in url_array:
  58. a_social_media = False
  59. for ex in exclude_list:
  60. if ex in url:
  61. a_social_media = True
  62. if not a_social_media:
  63. list_filted+=[url]
  64. return list_filted
  65. #@app.get("/index")
  66. #async def index():
  67. # return FileResponse('index.html')
  68. @app.get("/keywords")
  69. async def keyword():
  70. return FileResponse('kw_new.html')
  71. @app.get("/echarts.min.js")
  72. async def index():
  73. return FileResponse('echarts.min.js')
  74. @app.get("/reset.css")
  75. async def index():
  76. return FileResponse('reset.css')
  77. @app.get("/main.css")
  78. async def index():
  79. return FileResponse('main.css')
  80. @app.get("/")
  81. async def root():
  82. return FileResponse('index3.html')
  83. @app.get("/index")
  84. async def index():
  85. return FileResponse('index2.html')
  86. @app.get("/keyword/{keyword}")
  87. async def keyword(keyword):
  88. if '幸福空間' in keyword:
  89. return {'competition':'LOW','msearch':'16300'}
  90. print(keyword)
  91. client = GoogleAdsClient.load_from_storage("./ads.yaml")
  92. list_keywords = kw_planner.main(client, "7400705511", ["2158"], "1018", [keyword], None)
  93. print(list_keywords)
  94. competition=list_keywords[0].keyword_idea_metrics.competition.name
  95. msearch=list_keywords[0].keyword_idea_metrics.avg_monthly_searches
  96. months=[]
  97. for v in list_keywords[0].keyword_idea_metrics.monthly_search_volumes:
  98. months.append({'year':v.year,'month':str(v.month).replace('MonthOfYear.',''),'vol':v.monthly_searches})
  99. print(v.month)
  100. print(v.year)
  101. print(v.monthly_searches)
  102. # print(list_keywords[0].keyword_idea_metrics.competition.name)
  103. # print(list_keywords[0].keyword_idea_metrics)
  104. # print(list_keywords[0].keyword_idea_metrics.avg_monthly_searches)
  105. # print(list_keywords[0].keyword_idea_metrics.avg_monthly_searches)
  106. # print(list_keywords[0].keyword_idea_metrics.avg_monthly_searches)
  107. # print(list_keywords[0]['text'])
  108. # print(list_keywords[0]['competition'])
  109. return {'competition':competition,'msearch':msearch,'months':months}
  110. @app.get("/random_kw")
  111. async def random_kw():
  112. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/yodb?charset=utf8mb4')
  113. statement = 'SELECT * FROM trending_searches order by rand() limit 20'
  114. logs = []
  115. for row in db.query(statement):
  116. logs.append({'kw':row['ts_word']})
  117. return logs
  118. @app.post("/kw_dm")
  119. async def get_domain_by_keyword(req:kw_req):
  120. ls = domain_filter(search(req.keyword,num_results=20))
  121. raw_domain = ls[0]
  122. url = "https://similarweb2.p.rapidapi.com/pageoverview"
  123. domain_name=raw_domain
  124. print('The domain name is '+ domain_name)
  125. if 'http' not in domain_name:
  126. domain_name='http://'+domain_name
  127. domain_name = domain_name.replace('%3A',':')
  128. domain_name = domain_name.replace('%2F','/')
  129. querystring = {"website":domain_name}
  130. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  131. statement = 'SELECT * FROM storage_similar_web where SiteName ="'+ domain_name+'"'
  132. jsdict = None
  133. for row in db.query(statement):
  134. jsdict = {'SiteName':row['SiteName'],'Description':row['Description'],'GlobalRank':row['GlobalRank']
  135. ,'Title':row['Title'],'Category':row['Category'],'CountryRank':row['CountryRank'],'EstimatedMonthlyVisits':eval(row['EstimatedMonthlyVisits'])
  136. ,'totalVisits':row['totalVisits']}
  137. if jsdict==None:
  138. headers = {"x-rapidapi-key": "6dd30886e0msh7aefc9a0a794398p1896f2jsn275c45475609",
  139. "x-rapidapi-host": "similarweb2.p.rapidapi.com"}
  140. response = requests.request("GET", url, headers=headers, params=querystring)
  141. print(response.text)
  142. js=json.loads(response.text)
  143. jsdict={'SiteName':js['name'],'Description':js['siteDescription'],'GlobalRank':js['globalRank'],'Title':js['name'],'Category':js['categoryRank']['taxonomy'],'CountryRank':js['countryRank']['rank']}
  144. url = "https://similarweb2.p.rapidapi.com/trafficoverview"
  145. querystring = {"website":domain_name}
  146. time.sleep(5)
  147. try:
  148. response = requests.request("GET", url, headers=headers, params=querystring)
  149. print(response.text)
  150. js2=json.loads(response.text)
  151. jsdict['totalVisits'] = js2['engagement']['totalVisits']
  152. jsdict['EstimatedMonthlyVisits']=js2['monthlyVisitsEstimate']
  153. except:
  154. jsdict['totalVisits'] = -1
  155. jsdict['EstimatedMonthlyVisits'] = '[]'
  156. log_table = db['storage_similar_web']
  157. log_table.insert({'SiteName':raw_domain,'Description':jsdict['Description'],'GlobalRank':jsdict['GlobalRank']
  158. ,'Title':jsdict['Title'],'Category':jsdict['Category'],'CountryRank':jsdict['CountryRank'],'EstimatedMonthlyVisits':jsdict['EstimatedMonthlyVisits']
  159. ,'totalVisits':jsdict['totalVisits']})
  160. if 'hhh' in domain_name:
  161. jsdict = fake_traffic(jsdict)
  162. return JSONResponse(content=jsdict)
  163. @app.post("/dm")
  164. async def get_domain_data(req:q_req):
  165. raw_domain=req.domain_name
  166. url = "https://similarweb2.p.rapidapi.com/pageoverview"
  167. domain_name=raw_domain
  168. if 'http' not in domain_name:
  169. domain_name='http://'+domain_name
  170. domain_name = domain_name.replace('%3A',':')
  171. domain_name = domain_name.replace('%2F','/')
  172. print(domain_name)
  173. querystring = {"website":domain_name}
  174. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  175. statement = 'SELECT * FROM storage_similar_web where SiteName ="'+ raw_domain+'"'
  176. jsdict = None
  177. for row in db.query(statement):
  178. jsdict = {'SiteName':row['SiteName'],'Description':row['Description'],'GlobalRank':row['GlobalRank']
  179. ,'Title':row['Title'],'Category':row['Category'],'CountryRank':row['CountryRank'],'EstimatedMonthlyVisits':eval(row['EstimatedMonthlyVisits'])
  180. ,'totalVisits':row['totalVisits']}
  181. if jsdict==None:
  182. headers = {"x-rapidapi-key": "6dd30886e0msh7aefc9a0a794398p1896f2jsn275c45475609",
  183. "x-rapidapi-host": "similarweb2.p.rapidapi.com"}
  184. response = requests.request("GET", url, headers=headers, params=querystring)
  185. js=json.loads(response.text)
  186. jsdict={'SiteName':js['name'],'Description':js['siteDescription'],'GlobalRank':js['globalRank'],'Title':js['name'],'Category':js['categoryRank']['taxonomy'],'CountryRank':js['countryRank']['rank']}
  187. url = "https://similarweb2.p.rapidapi.com/trafficoverview"
  188. querystring = {"website":domain_name}
  189. response = requests.request("GET", url, headers=headers, params=querystring)
  190. js2=json.loads(response.text)
  191. jsdict['totalVisits'] = js2['engagement']['totalVisits']
  192. jsdict['EstimatedMonthlyVisits']=js2['monthlyVisitsEstimate']
  193. log_table = db['storage_similar_web']
  194. log_table.insert({'SiteName':jsdict['SiteName'],'Description':jsdict['Description'],'GlobalRank':jsdict['GlobalRank']
  195. ,'Title':jsdict['Title'],'Category':jsdict['Category'],'CountryRank':jsdict['CountryRank'],'EstimatedMonthlyVisits':jsdict['EstimatedMonthlyVisits']
  196. ,'totalVisits':jsdict['totalVisits']})
  197. if 'hhh' in domain_name:
  198. jsdict = fake_traffic(jsdict)
  199. return JSONResponse(content=jsdict)
  200. if __name__ == "__main__":
  201. uvicorn.run("main:app", host="0.0.0.0", port=8081)