main.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import uvicorn
  2. import fastapi
  3. from fastapi.middleware.cors import CORSMiddleware
  4. from linebot import LineBotApi, WebhookHandler
  5. from linebot.models import (
  6. MessageEvent, TextMessage, TextSendMessage, FollowEvent, TemplateSendMessage, ButtonsTemplate, URITemplateAction,
  7. )
  8. import dataset
  9. import requests
  10. import json
  11. import qrcode
  12. from PIL import Image
  13. import base64, io
  14. app = fastapi.FastAPI()
  15. app.add_middleware(
  16. CORSMiddleware,
  17. allow_origins=['*'],
  18. allow_credentials=True,
  19. allow_methods=["*"],
  20. allow_headers=["*"],
  21. )
  22. # bot config
  23. line_bot_api = LineBotApi("SJT7VPT4RMQFLcS27jQBy3FcC24gtDrkcwJWZ5Xzqesr5T78LOKudHEJzt0k3b2S7n4KPwf27J7DVz2c8NQ4plSaaQylEeB1cYrfejaE/RPG/lCIQBYe4iBTzo26s4i2PcmT89837per/lTyvhVIKAdB04t89/1O/w1cDnyilFU=")
  24. handler = WebhookHandler("411ae3ef7e766739ed2c2c27b249d010")
  25. # db connect
  26. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
  27. table = db['users']
  28. # callback event
  29. @app.post("/callback")
  30. async def callback(request: fastapi.Request):
  31. signature = request.headers['X-Line-Signature']
  32. body = await request.body()
  33. handler.handle(body.decode('utf-8'), signature)
  34. return 'OK'
  35. # nft collection api
  36. @app.get("/collection/{userid}")
  37. def collection(userid):
  38. xname = userid
  39. sql = 'SELECT a.* FROM nft a INNER JOIN ( SELECT userid FROM users WHERE userid="' + xname + '" ) b ON b.userid = a.userid'
  40. result = db.query(sql)
  41. rows = {}
  42. i = 0
  43. for row in result:
  44. rows[i] = row
  45. i += 1
  46. return rows
  47. # receive handler
  48. @app.get("/receive/{userid}")
  49. def receive(userid):
  50. # generate qr code from user id
  51. results = table.find_one(userid=userid)
  52. address = results['useraddress']
  53. qr = qrcode.QRCode(
  54. version=1,
  55. box_size=10,
  56. border=5)
  57. qr.add_data(address)
  58. qr.make(fit=True)
  59. img_qr = qr.make_image(fill='black', back_color='white')
  60. filename = "qrcode/" + userid + '.png'
  61. img_save = img_qr.save(filename)
  62. # open file
  63. im = Image.open(filename)
  64. # convert
  65. imgByteArr = io.BytesIO()
  66. im.save(imgByteArr, format='PNG')
  67. # decode to ascii
  68. x = imgByteArr.getvalue()
  69. base64.b64encode(x).decode('ascii')
  70. encode = base64.b64encode(x).decode('ascii')
  71. # add to db
  72. data = dict(base64=encode)
  73. result = data['base64']
  74. # print(data['base64'])
  75. # table.insert(data)
  76. table.update(dict(userid=userid, base=result), ['userid'])
  77. # follow event
  78. @handler.add(FollowEvent)
  79. def handle_follow(event):
  80. # get user id when follow
  81. real_user_id = event.source.user_id
  82. rand_num = '_test_000_000_002'
  83. user_id = event.source.user_id + rand_num
  84. # create user account
  85. url = 'https://nft-api-staging.joyso.io/api/v1/accounts'
  86. headers = {'Authorization': 'Basic bmZ0OmMxOTEzOWMzYjM3YjdjZWU3ZmY3OTFiZGU3NzdjZWNl'}
  87. # setup for temp use (unique id)
  88. data = 'uid=' + user_id
  89. r = requests.post(url=url, headers=headers, data=data)
  90. # extract the account address
  91. dict_str = json.loads(r.text)
  92. user_account = dict_str['account']
  93. user_address = user_account['address']
  94. # write in sql
  95. data = dict(userid=real_user_id, useraddress=user_address)
  96. table.insert(data)
  97. print(" Follow event: " + event.source.user_id)
  98. line_bot_api.reply_message(
  99. event.reply_token,
  100. TextSendMessage(text='歡迎加入好友'))
  101. # message handler
  102. @handler.add(MessageEvent, message=TextMessage)
  103. def message(event):
  104. if '我要發送' in event.message.text:
  105. button_template_message = ButtonsTemplate(
  106. title=' ',
  107. text='點擊並打開發送頁面,便可以選擇要發送的NFT給對方!',
  108. actions=[
  109. URITemplateAction(
  110. label='打開發送頁面',
  111. uri='http://q.ptt.cx/a1/index-line.html?userid=' + event.source.user_id),])
  112. line_bot_api.reply_message(
  113. event.reply_token,
  114. TemplateSendMessage(
  115. alt_text="Receive",
  116. template=button_template_message))
  117. elif '我要接收' in event.message.text:
  118. button_template_message = ButtonsTemplate(
  119. title=' ',
  120. text='點擊並打開接收頁面,即可分享接收地址給對方!',
  121. actions=[
  122. URITemplateAction(
  123. label='打開接收頁面',
  124. uri='http://ark.cards/receive/' + event.source.user_id), ])
  125. line_bot_api.reply_message(
  126. event.reply_token,
  127. TemplateSendMessage(
  128. alt_text="Receive",
  129. template=button_template_message))
  130. elif '我的收藏' in event.message.text:
  131. button_template_message = ButtonsTemplate(
  132. title=' ',
  133. text='點擊並打開接收頁面,即可分享接收地址給對方!',
  134. actions=[
  135. URITemplateAction(
  136. label='打開接收頁面',
  137. uri='http://ark.cards/collection/' + event.source.user_id), ])
  138. line_bot_api.reply_message(
  139. event.reply_token,
  140. TemplateSendMessage(
  141. alt_text="Receive",
  142. template=button_template_message))
  143. else:
  144. line_bot_api.reply_message(
  145. event.reply_token,
  146. TextSendMessage(text="更多的服務內容,歡迎請上我們的官網!(http://ark.cards)"))
  147. if __name__ == '__main__':
  148. uvicorn.run("main:app", host="0.0.0.0", port=8228, reload=True)