main.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from enum import Enum
  2. import time
  3. from datetime import datetime
  4. from typing import Optional
  5. from pydantic import BaseModel
  6. from fastapi import FastAPI, Query, UploadFile, File
  7. from fastapi import FastAPI
  8. from fastapi.middleware.cors import CORSMiddleware
  9. import json
  10. import urllib.request
  11. import dataset,json
  12. import pandas as pd
  13. from gspread_pandas import Spread, Client
  14. from oauth2client.service_account import ServiceAccountCredentials
  15. import gspread
  16. from first import first
  17. app = FastAPI()
  18. origins = [
  19. "http://172.105.205.52",
  20. "http://172.105.205.52:8001",
  21. ]
  22. app.add_middleware(
  23. CORSMiddleware,
  24. # allow_origins=origins,
  25. allow_origins=["*"],
  26. allow_credentials=True,
  27. allow_methods=["*"],
  28. allow_headers=["*"],
  29. )
  30. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/NFTBoard?charset=utf8mb4')
  31. class subreq(BaseModel):
  32. email:str
  33. @app.get("/showdata/{limit}")
  34. async def showdata(limit):
  35. url = 'https://api.coinmarketcap.com/data-api/v3/nft/collections?start=0&limit=' + limit
  36. r = urllib.request.urlopen(url)
  37. collections = json.loads(r.read())['data']['collections']
  38. reqs = []
  39. for req in collections:
  40. logo = 'https://s3.coinmarketcap.com/generated/nft/collections/' + req['slug'] + '.png';
  41. last_7_days = 'https://s3.coinmarketcap.com/generated/sparklines/nft/collection/web/30d/' + req['slug'] +'.png';
  42. reqs.append({'rank':req['rank'],'slug':req['slug'],'logo':logo,'website':req['website'],'name':req['name'],'assets':req['transferUniqueAssetsAT'],'collection_net_worth':req['netWorth'],'volume_7d':req['volume7d'],'sales_7d':req['sales7d'],'volume_all_time':req['volumeAT'],'sales_all_time':req['salesAT'],'last_7_days':last_7_days})
  43. return reqs
  44. @app.post("/add_sub")
  45. async def add_subclient_info(req:subreq):
  46. code = 1
  47. sub_table = db['Subscribe']
  48. time_stamp = datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S")
  49. statement='SELECT COUNT(1) FROM Subscribe WHERE email = "'+req.email+'"'
  50. if first(db.query(statement))['COUNT(1)']==0:
  51. pk = sub_table.insert({'email':req.email,'timestamp':time_stamp})
  52. make_ci_df()
  53. code = 0
  54. return {'msg':code}#0 means succss added, 1 means email is duplicated
  55. @app.get("/get_sub_list")
  56. async def add_subclient_info():
  57. statement = 'SELECT * FROM Subscribe'
  58. result = []
  59. for row in db.query(statement):
  60. result += [{'id':row['id'],'email':row['email'],'timeStamp':row['timestamp']}]
  61. return result
  62. def make_ci_df():
  63. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/NFTBoard?charset=utf8mb4')
  64. statement = 'SELECT * FROM Subscribe ORDER BY timestamp DESC'
  65. #2021-05-23 15:57:43
  66. df = pd.DataFrame()
  67. for row in db.query(statement):
  68. date_format = "%Y-%M-%d %H:%M:%S"
  69. fdate = row['timestamp'].strftime('%Y-%m-%d %H時 %M分')
  70. df = df.append({'serial id':row['id'],'e-mail':row['email'],'登記時間':fdate}, ignore_index=True)
  71. df = df[['serial id','e-mail','登記時間']]
  72. save_sheet(df,'subscribe_rec','Sheet1')
  73. def save_sheet(df,filename,tabname,startpos='A1'):
  74. scope = ['https://spreadsheets.google.com/feeds',
  75. 'https://www.googleapis.com/auth/drive']
  76. credentials = ServiceAccountCredentials.from_json_keyfile_name('spread2.json', scope)
  77. gc = gspread.authorize(credentials)
  78. spread = Spread(filename,creds=credentials)
  79. spread.df_to_sheet(df, sheet=tabname, start=startpos, replace=True)