main.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import uvicorn
  2. import fastapi
  3. from linebot import LineBotApi, WebhookHandler
  4. from linebot.models import (
  5. MessageEvent, TextMessage, TextSendMessage, FollowEvent, TemplateSendMessage, ButtonsTemplate, URITemplateAction,
  6. )
  7. import dataset
  8. import requests
  9. import json
  10. app = fastapi.FastAPI()
  11. # bot config
  12. line_bot_api = LineBotApi("SJT7VPT4RMQFLcS27jQBy3FcC24gtDrkcwJWZ5Xzqesr5T78LOKudHEJzt0k3b2S7n4KPwf27J7DVz2c8NQ4plSaaQylEeB1cYrfejaE/RPG/lCIQBYe4iBTzo26s4i2PcmT89837per/lTyvhVIKAdB04t89/1O/w1cDnyilFU=")
  13. handler = WebhookHandler("411ae3ef7e766739ed2c2c27b249d010")
  14. # db connect
  15. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
  16. table = db['users']
  17. # callback event
  18. @app.post("/callback")
  19. async def callback(request: fastapi.Request):
  20. signature = request.headers['X-Line-Signature']
  21. body = await request.body()
  22. handler.handle(body.decode('utf-8'), signature)
  23. return 'OK'
  24. # nft collection api
  25. @app.get("/collection/{userid}")
  26. def collection(userid):
  27. xname = userid
  28. sql = 'SELECT a.* FROM nft a INNER JOIN ( SELECT userid FROM users WHERE userid="'+xname+'" ) b ON b.userid = a.userid'
  29. result = db.query(sql)
  30. rows={}
  31. i = 0
  32. for row in result:
  33. rows[i]=row
  34. i+=1
  35. return rows
  36. # follow event
  37. @handler.add(FollowEvent)
  38. def handle_follow(event):
  39. # get user id when follow
  40. real_user_id = event.source.user_id
  41. rand_num = '_test_000_000_002'
  42. user_id = event.source.user_id+rand_num
  43. # create user account
  44. url = 'https://nft-api-staging.joyso.io/api/v1/accounts'
  45. headers = {'Authorization': 'Basic bmZ0OmMxOTEzOWMzYjM3YjdjZWU3ZmY3OTFiZGU3NzdjZWNl'}
  46. # setup for temp use (unique id)
  47. data = 'uid='+user_id
  48. r = requests.post(url=url, headers=headers, data=data)
  49. # extract the account address
  50. dict_str = json.loads(r.text)
  51. user_account = dict_str['account']
  52. user_address = user_account['address']
  53. # write in sql
  54. data = dict(userid=real_user_id, useraddress=user_address)
  55. table.insert(data)
  56. print(" Follow event: "+event.source.user_id)
  57. line_bot_api.reply_message(
  58. event.reply_token,
  59. TextSendMessage(text='歡迎加入好友'))
  60. # message handler
  61. @handler.add(MessageEvent, message=TextMessage)
  62. def message(event):
  63. if '我要發送' in event.message.text:
  64. button_template_message = ButtonsTemplate(
  65. title=' ',
  66. text='點擊並打開發送頁面,便可以選擇要發送的NFT給對方!',
  67. actions=[
  68. URITemplateAction(
  69. label='打開發送頁面',
  70. uri='http://q.ptt.cx/a1/index-line.html?userid=' + event.source.user_id),])
  71. line_bot_api.reply_message(
  72. event.reply_token,
  73. TemplateSendMessage(
  74. alt_text="Receive",
  75. template=button_template_message))
  76. elif '我要接收' in event.message.text:
  77. user_id = event.source.user_id
  78. print(" message event: "+user_id)
  79. button_template_message = ButtonsTemplate(
  80. title=' ',
  81. text='點擊並打開接收頁面,即可分享接收地址給對方!',
  82. actions=[
  83. URITemplateAction(
  84. label='打開接收頁面',
  85. uri='http://q.ptt.cx/a1/index-line.html?userid=' + event.source.user_id),])
  86. line_bot_api.reply_message(
  87. event.reply_token,
  88. TemplateSendMessage(
  89. alt_text="Receive",
  90. template=button_template_message))
  91. else:
  92. line_bot_api.reply_message(
  93. event.reply_token,
  94. TextSendMessage(text="更多的服務內容,歡迎請上我們的官網!(http://ark.cards)"))
  95. if __name__ == '__main__':
  96. uvicorn.run("main:app", host="0.0.0.0", port=8228, reload=True)