| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | from enum import Enumimport timefrom datetime import datetimefrom typing import Optionalfrom pydantic import BaseModelfrom fastapi import FastAPI, Query, UploadFile, Filefrom fastapi import FastAPIfrom fastapi.middleware.cors import CORSMiddlewareimport jsonimport urllib.requestimport dataset,jsonimport pandas as pdfrom gspread_pandas import Spread, Clientfrom oauth2client.service_account import ServiceAccountCredentialsimport gspreadfrom first import firstapp = FastAPI()origins = [    "http://172.105.205.52",    "http://172.105.205.52:8001",]app.add_middleware(    CORSMiddleware,    # allow_origins=origins,    allow_origins=["*"],    allow_credentials=True,    allow_methods=["*"],    allow_headers=["*"],)db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/NFTBoard?charset=utf8mb4')class subreq(BaseModel):    email:str@app.get("/showdata/{limit}")async def showdata(limit):    url = 'https://api.coinmarketcap.com/data-api/v3/nft/collections?start=0&limit=' + limit    r = urllib.request.urlopen(url)    collections = json.loads(r.read())['data']['collections']        reqs = []    for req in collections:        logo = 'https://s3.coinmarketcap.com/generated/nft/collections/' + req['slug'] + '.png';        last_7_days = 'https://s3.coinmarketcap.com/generated/sparklines/nft/collection/web/30d/' + req['slug'] +'.png';        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})    return reqs@app.post("/add_sub")async def add_subclient_info(req:subreq):    code = 1    sub_table = db['Subscribe']    time_stamp = datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S")    statement='SELECT COUNT(1) FROM Subscribe WHERE email = "'+req.email+'"'    if first(db.query(statement))['COUNT(1)']==0:        pk = sub_table.insert({'email':req.email,'timestamp':time_stamp})        make_ci_df()        code = 0    return {'msg':code}#0 means succss added, 1 means email is duplicated@app.get("/get_sub_list")async def add_subclient_info():    statement = 'SELECT * FROM Subscribe'    result = []    for row in db.query(statement):        result += [{'id':row['id'],'email':row['email'],'timeStamp':row['timestamp']}]    return resultdef make_ci_df():    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/NFTBoard?charset=utf8mb4')    statement = 'SELECT * FROM Subscribe ORDER BY timestamp DESC'    #2021-05-23 15:57:43    df = pd.DataFrame()    for row in db.query(statement):        date_format = "%Y-%M-%d %H:%M:%S"        fdate = row['timestamp'].strftime('%Y-%m-%d %H時 %M分')        df = df.append({'serial id':row['id'],'e-mail':row['email'],'登記時間':fdate}, ignore_index=True)    df = df[['serial id','e-mail','登記時間']]    save_sheet(df,'subscribe_rec','Sheet1')def save_sheet(df,filename,tabname,startpos='A1'):    scope = ['https://spreadsheets.google.com/feeds',            'https://www.googleapis.com/auth/drive']    credentials = ServiceAccountCredentials.from_json_keyfile_name('spread2.json', scope)    gc = gspread.authorize(credentials)    spread = Spread(filename,creds=credentials)    spread.df_to_sheet(df, sheet=tabname, start=startpos, replace=True)
 |