Cozmo人工智能机器人SDK使用笔记(9)-判断部分if_this_then_that

举报
zhangrelay 发表于 2021/07/15 02:38:13 2021/07/15
【摘要】 Cozmo判断部分有3个主题: gmailsportstock 1. gmail 此示例演示了如何使用“If This Then That”(http://ifttt.com)使Cozmo在Gmail帐户收到电子邮件时作出回应。以下说明将引导您在IFTTT网站上设置小程序。当调用applet触发器(发送在此示例中启动的Web服务器收到的Web请求)时,Cozmo将播放动...

Cozmo判断部分有3个主题:

  1. gmail
  2. sport
  3. stock

1. gmail

此示例演示了如何使用“If This Then That”(http://ifttt.com)使Cozmo在Gmail帐户收到电子邮件时作出回应。以下说明将引导您在IFTTT网站上设置小程序。当调用applet触发器(发送在此示例中启动的Web服务器收到的Web请求)时,Cozmo将播放动画,说出电子邮件发件人的姓名并在他的脸上显示邮箱图像。

If This Then That" Gmail example

This example demonstrates how "If This Then That" (http://ifttt.com) can be used
make Cozmo respond when a Gmail account receives an email. Instructions below
will lead you through setting up an applet on the IFTTT website. When the applet
trigger is called (which sends a web request received by the web server started
in this example), Cozmo will play an animation, speak the email sender's name and
show a mailbox image on his face.

Please place Cozmo on the charger for this example. When necessary, he will be
rolled off and back on.

Follow these steps to set up and run the example:
    1) Provide a a static ip, URL or similar that can be reached from the If This
        Then That server. One easy way to do this is with ngrok, which sets up
        a secure tunnel to localhost running on your machine.

        To set up ngrok:
        a) Follow instructions here to download and install:
            https://ngrok.com/download
        b) Run this command to create a secure public URL for port 8080:
            ./ngrok http 8080
        c) Note the HTTP forwarding address shown in the terminal (e.g., http://55e57164.ngrok.io).
            You will use this address in your applet, below.

        WARNING: Using ngrok exposes your local web server to the internet. See the ngrok
        documentation for more information: https://ngrok.com/docs

    2) Set up your applet on the "If This Then That" website.
        a) Sign up and sign into https://ifttt.com
        b) Create an applet: https://ifttt.com/create
        c) Set up your trigger.
            1. Click "this".
            2. Select "Gmail" as your service. If prompted, click "Connect",
                select your Gmail account, and click “Allow” to provide permissions
                to IFTTT for your email account. Click "Done".
            3. Under "Choose a Trigger", select “Any new email in inbox".
        d) Set up your action.
            1. Click “that".
            2. Select “Maker Webhooks" to set it as your action channel. Connect to the Maker channel if prompted.
            3. Click “Make a web request" and fill out the fields as follows. Remember your publicly
                accessible URL from above (e.g., http://55e57164.ngrok.io) and use it in the URL field,
                followed by "/iftttGmail" as shown below:

                 URL: http://55e57164.ngrok.io/iftttGmail
                 Method: POST
                 Content Type: application/json
                 Body: {"FromAddress":"{{FromAddress}}"}

            5. Click “Create Action" then “Finish".

    3) Test your applet.
        a) Run this script at the command line: ./ifttt_gmail.py
        b) On ifttt.com, on your applet page, click “Check now”. See that IFTTT confirms that the applet
            was checked.
        c) Send an email to the Gmail account in your recipe
        d) On your IFTTT applet webpage, again click “Check now”. This should cause IFTTT to detect that
            the email was received and send a web request to the ifttt_gmail.py script.
        e) In response to the ifttt web request, Cozmo should roll off the charger, raise and lower
            his lift, announce the email, and then show a mailbox image on his face.


  
  1. import asyncio
  2. import re
  3. import sys
  4. try:
  5. from aiohttp import web
  6. except ImportError:
  7. sys.exit("Cannot import from aiohttp. Do `pip3 install --user aiohttp` to install")
  8. import cozmo
  9. from common import IFTTTRobot
  10. app = web.Application()
  11. async def serve_gmail(request):
  12. '''Define an HTTP POST handler for receiving requests from If This Then That.
  13. You may modify this method to change how Cozmo reacts to the email
  14. being received.
  15. '''
  16. json_object = await request.json()
  17. # Extract the name of the email sender.
  18. from_email_address = json_object["FromAddress"]
  19. # Use a regular expression to break apart pieces of the email address
  20. match_object = re.search(r'([\w.]+)@([\w.]+)', from_email_address)
  21. email_local_part = match_object.group(1)
  22. robot = request.app['robot']
  23. async def read_name():
  24. try:
  25. async with robot.perform_off_charger():
  26. '''If necessary, Move Cozmo's Head and Lift to make it easy to see Cozmo's face.'''
  27. await robot.get_in_position()
  28. # First, have Cozmo play an animation
  29. await robot.play_anim_trigger(cozmo.anim.Triggers.ReactToPokeStartled).wait_for_completed()
  30. # Next, have Cozmo speak the name of the email sender.
  31. await robot.say_text("Email from " + email_local_part).wait_for_completed()
  32. # Last, have Cozmo display an email image on his face.
  33. robot.display_image_file_on_face("../face_images/ifttt_gmail.png")
  34. except cozmo.RobotBusy:
  35. cozmo.logger.warning("Robot was busy so didn't read email address: "+ from_email_address)
  36. # Perform Cozmo's task in the background so the HTTP server responds immediately.
  37. asyncio.ensure_future(read_name())
  38. return web.Response(text="OK")
  39. # Attach the function as an HTTP handler.
  40. app.router.add_post('/iftttGmail', serve_gmail)
  41. if __name__ == '__main__':
  42. cozmo.setup_basic_logging()
  43. cozmo.robot.Robot.drive_off_charger_on_connect = False
  44. # Use our custom robot class with extra helper methods
  45. cozmo.conn.CozmoConnection.robot_factory = IFTTTRobot
  46. try:
  47. app_loop = asyncio.get_event_loop()
  48. sdk_conn = cozmo.connect_on_loop(app_loop)
  49. # Wait for the robot to become available and add it to the app object.
  50. app['robot'] = app_loop.run_until_complete(sdk_conn.wait_for_robot())
  51. except cozmo.ConnectionError as e:
  52. sys.exit("A connection error occurred: %s" % e)
  53. web.run_app(app)

2. sport

此示例演示了如何使用“If This Then That”(http://ifttt.com)使Cozmo在您指定的团队进行游戏内或最终分数更新时做出响应。 以下说明将引导您在IFTTT网站上设置小程序。 当调用applet触发器(发送在此示例中启动的Web服务器接收的Web请求)时,Cozmo将播放动画,在他的脸上显示图像,并说出游戏内更新。

If This Then That" sports example

This example demonstrates how "If This Then That" (http://ifttt.com) can be used
make Cozmo respond when there is an in-game or final score update for the team
you specify. Instructions below will lead you through setting up an applet on
the IFTTT website. When the applet trigger is called (which sends a web request
received by the web server started in this example), Cozmo will play an animation,
show an image on his face, and speak the in-game update.

Please place Cozmo on the charger for this example. When necessary, he will be
rolled off and back on.

Follow these steps to set up and run the example:
    1) Provide a a static ip, URL or similar that can be reached from the "If This
        Then That" server. One easy way to do this is with ngrok, which sets up
        a secure tunnel to localhost running on your machine.

        To set up ngrok:
        a) Follow instructions here to download and install:
            https://ngrok.com/download
        b) Run this command to create a secure public URL for port 8080:
            ./ngrok http 8080
        c) Note the HTTP forwarding address shown in the terminal (e.g., http://55e57164.ngrok.io).
            You will use this address in your applet, below.

        WARNING: Using ngrok exposes your local web server to the internet. See the ngrok
        documentation for more information: https://ngrok.com/docs

    2) Set up your applet on the "If This Then That" website.
        a) Sign up and sign into https://ifttt.com
        b) Create an applet: https://ifttt.com/create
        c) Set up your trigger.
            1. Click "this".
            2. Select "ESPN" as your service.
            3. Under "Choose a Trigger", select “New in-game update".
            4. In section "Complete Trigger Fields", enter your sport and team and click “Create Trigger".

        d) Set up your action.
            1. Click “that".
            2. Select “Maker Webhooks" to set it as your action channel. Connect to the Maker channel if prompted.
            3. Click “Make a web request" and fill out the fields as follows. Remember your publicly
                accessible URL from above (e.g., http://55e57164.ngrok.io) and use it in the URL field,
                followed by "/iftttSports" as shown below:

                 URL: http://55e57164.ngrok.io/iftttSports
                 Method: POST
                 Content Type: application/json
                 Body: {"AlertBody":"{{AlertBody}}"}

            5. Click “Create Action" then “Finish".

    3) Test your applet.
        a) Run this script at the command line: ./ifttt_sports.py
        b) On ifttt.com, on your applet page, click “Check now”. See that IFTTT confirms that the applet
            was checked.
        c) Wait for new in-game updates for your team and see Cozmo react! Cozmo should roll off the charger, raise
            and lower his lift, show an image on his face and speak the in-game update.


  
  1. import asyncio
  2. import sys
  3. try:
  4. from aiohttp import web
  5. except ImportError:
  6. sys.exit("Cannot import from aiohttp. Do `pip3 install --user aiohttp` to install")
  7. import cozmo
  8. from common import IFTTTRobot
  9. app = web.Application()
  10. async def serve_sports(request):
  11. '''Define an HTTP POST handler for receiving requests from If This Then That.
  12. You may modify this method to change how Cozmo reacts to
  13. an in-game update from IFTTT.
  14. '''
  15. json_object = await request.json()
  16. # Extract the text for the in-game update.
  17. alert_body = json_object["AlertBody"]
  18. robot = request.app['robot']
  19. async def read_name():
  20. try:
  21. async with robot.perform_off_charger():
  22. '''If necessary, Move Cozmo's Head and Lift to make it easy to see Cozmo's face.'''
  23. await robot.get_in_position()
  24. # First, have Cozmo play an animation
  25. await robot.play_anim_trigger(cozmo.anim.Triggers.ReactToPokeStartled).wait_for_completed()
  26. # Next, have Cozmo speak the text from the in-game update.
  27. await robot.say_text(alert_body).wait_for_completed()
  28. # Last, have Cozmo display a sports image on his face.
  29. robot.display_image_file_on_face("../face_images/ifttt_sports.png")
  30. except cozmo.RobotBusy:
  31. cozmo.logger.warning("Robot was busy so didn't read update: '" + alert_body +"'")
  32. # Perform Cozmo's task in the background so the HTTP server responds immediately.
  33. asyncio.ensure_future(read_name())
  34. return web.Response(text="OK")
  35. # Attach the function as an HTTP handler.
  36. app.router.add_post('/iftttSports', serve_sports)
  37. if __name__ == '__main__':
  38. cozmo.setup_basic_logging()
  39. cozmo.robot.Robot.drive_off_charger_on_connect = False
  40. # Use our custom robot class with extra helper methods
  41. cozmo.conn.CozmoConnection.robot_factory = IFTTTRobot
  42. try:
  43. app_loop = asyncio.get_event_loop()
  44. sdk_conn = cozmo.connect_on_loop(app_loop)
  45. # Wait for the robot to become available and add it to the app object.
  46. app['robot'] = app_loop.run_until_complete(sdk_conn.wait_for_robot())
  47. except cozmo.ConnectionError as e:
  48. sys.exit("A connection error occurred: %s" % e)
  49. web.run_app(app)

 


此IFTTT示例使用Flask Web框架并且是同步的,与其他异步的IFTTT示例不同并使用aiohttp。在此示例中,IFTTT Web请求由函数receive_ifttt_web_request接收。进入该方法的每个Web请求都会添加到Queue ifttt_queue,并且HTTP状态代码200或503会立即返回到IFTTT。该队列由worker函数检查,该函数在后台线程上运行(由run函数启动)。当worker函数在队列中找到新请求时,请求将从队列中删除并在方法then_that_action中处理。

与ifttt_sports.py示例一样,此示例演示了如何使用“If This Then That”(http://ifttt.com)使Cozmo在您指定的团队有游戏内或最终得分更新时做出响应。以下说明将引导您完成设置
在IFTTT网站上发布一个applet。当调用applet触发器(发送在此示例中启动的烧瓶服务器接收的Web请求)时,Cozmo将播放动画,在他的脸上显示图像,并说出游戏内更新。

If This Then That" sports example

This IFTTT example uses the Flask web framework and is synchronous, unlike the other
IFTTT examples which are asynchronous and use aiohttp. In this example, IFTTT web
requests are received by function receive_ifttt_web_request. Each web request that comes
into that method is added to Queue ifttt_queue and an HTTP status code of 200 or 503 is
immediately returned to IFTTT. The queue is checked by the worker function, which is
running on a background thread (started by the run function). When a new request is
found on the queue by the worker function, the request is removed from the queue and
processed in method then_that_action.

Like the ifttt_sports.py example, this example demonstrates how "If This Then That"
(http://ifttt.com) can be used make Cozmo respond when there is an in-game or final
score update for the team you specify. Instructions below will lead you through setting
up an applet on the IFTTT website. When the applet trigger is called (which sends a web
request received by the flask server started in this example), Cozmo will play an
animation, show an image on his face, and speak the in-game update.

Please place Cozmo on the charger for this example. When necessary, he will be
rolled off and back on.

Follow these steps to set up and run the example:
    1) Provide a a static ip, URL or similar that can be reached from the "If This
        Then That" server. One easy way to do this is with ngrok, which sets up
        a secure tunnel to localhost running on your machine.

        To set up ngrok:
        a) Follow instructions here to download and install:
            https://ngrok.com/download
        b) Run this command to create a secure public URL for port 8080:
            ./ngrok http 8080
        c) Note the HTTP forwarding address shown in the terminal (e.g., http://55e57164.ngrok.io).
            You will use this address in your applet, below.

        WARNING: Using ngrok exposes your local web server to the internet. See the ngrok
        documentation for more information: https://ngrok.com/docs

    2) Set up your applet on the "If This Then That" website.
        a) Sign up and sign into https://ifttt.com
        b) Create an applet: https://ifttt.com/create
        c) Set up your trigger.
            1. Click "this".
            2. Select "ESPN" as your service.
            3. Under "Choose a Trigger", select “New in-game update".
            4. In section "Complete Trigger Fields", enter your sport and team and click “Create Trigger".

        d) Set up your action.
            1. Click “that".
            2. Select “Maker" to set it as your action channel. Connect to the Maker channel if prompted.
            3. Click “Make a web request" and fill out the fields as follows. Remember your publicly
                accessible URL from above (e.g., http://55e57164.ngrok.io) and use it in the URL field,
                followed by "/iftttSports" as shown below:

                 URL: http://55e57164.ngrok.io/iftttSports
                 Method: POST
                 Content Type: application/json
                 Body: {"AlertBody":"{{AlertBody}}"}

            5. Click “Create Action" then “Finish".

    3) Test your applet.
        a) Run this script at the command line: ./ifttt_sports.py
        b) On ifttt.com, on your applet page, click “Check now”. See that IFTTT confirms that the applet
            was checked.
        c) Wait for new in-game updates for your team and see Cozmo react! Cozmo should roll off the charger, raise
            and lower his lift, show an image on his face and speak the in-game update.


  
  1. import json
  2. import queue
  3. import sys
  4. import threading
  5. import cozmo
  6. sys.path.append('../lib/')
  7. import flask_helpers
  8. from common import IFTTTRobot
  9. try:
  10. from flask import Flask, request
  11. except ImportError:
  12. sys.exit("Cannot import from flask: Do `pip3 install --user flask` to install")
  13. flask_app = Flask(__name__)
  14. ifttt_queue = queue.Queue()
  15. robot = None
  16. @flask_app.route('/iftttSports', methods=['POST'])
  17. def receive_ifttt_web_request():
  18. '''Web request endpoint named "iftttSports" for IFTTT to call when a new in-game
  19. update for your team is posted on ESPN.
  20. In the IFTTT web request, in the URL field, specify this method
  21. as the endpoint. For instance, if your public url is http://my.url.com,
  22. then in the IFTTT web request URL field put the following:
  23. http://my.url.com/iftttSports. Then, this endpoint will be called when
  24. IFTTT checks and discovers that a new in-game update for your team is
  25. posted on ESPN.
  26. '''
  27. # Retrieve the data passed by If This Then That in the web request body.
  28. json_object = json.loads(request.data.decode("utf-8"))
  29. # Extract the text for the in-game update.
  30. alert_body = json_object["AlertBody"]
  31. # Add this request to the queue of in-game updates awaiting Cozmo's reaction.
  32. ifttt_queue.put((then_that_action, alert_body))
  33. # Return promptly so If This Then That knows that the web request was received
  34. # successfully.
  35. return ""
  36. def then_that_action(alert_body):
  37. '''Controls how Cozmo responds to the in-game update.
  38. You may modify this method to change how Cozmo reacts to
  39. the update from IFTTT.
  40. '''
  41. try:
  42. with robot.perform_off_charger():
  43. '''If necessary, Move Cozmo's Head and Lift to make it easy to see Cozmo's face.'''
  44. robot.get_in_position()
  45. # First, have Cozmo play an animation
  46. robot.play_anim_trigger(cozmo.anim.Triggers.ReactToPokeStartled).wait_for_completed()
  47. # Next, have Cozmo speak the text from the in-game update.
  48. robot.say_text(alert_body).wait_for_completed()
  49. # Last, have Cozmo display a sports image on his face.
  50. robot.display_image_file_on_face("../face_images/ifttt_sports.png")
  51. except cozmo.exceptions.RobotBusy:
  52. pass
  53. def worker():
  54. while True:
  55. item = ifttt_queue.get()
  56. if item is None:
  57. break
  58. queued_action, action_args = item
  59. queued_action(action_args)
  60. def run(sdk_conn):
  61. global robot
  62. robot = sdk_conn.wait_for_robot()
  63. threading.Thread(target=worker).start()
  64. # Start flask web server so that /iftttSports can serve as endpoint.
  65. flask_helpers.run_flask(flask_app, "127.0.0.1", 8080, False, False)
  66. # Putting None on the queue stops the thread. This is called when the
  67. # user hits Control C, which stops the run_flask call.
  68. ifttt_queue.put(None)
  69. if __name__ == '__main__':
  70. cozmo.setup_basic_logging()
  71. cozmo.robot.Robot.drive_off_charger_on_connect = False
  72. # Use our custom robot class with extra helper methods
  73. cozmo.conn.CozmoConnection.robot_factory = IFTTTRobot
  74. try:
  75. cozmo.connect(run)
  76. except cozmo.ConnectionError as e:
  77. sys.exit("A connection error occurred: %s" % e)

3. stock

此示例演示了如何使用“If This Then That”(http://ifttt.com)使Cozmo在股票代码符号增加1%或更多时作出响应。 以下说明将引导您在IFTTT网站上设置小程序。 当调用applet触发器(发送在此示例中启动的Web服务器接收的Web请求)时,Cozmo将播放动画,说出公司名称和增加的百分比,并在他的脸上显示股票市场图像。

If This Then That" Stock example

This example demonstrates how "If This Then That" (http://ifttt.com) can be used
make Cozmo respond when a stock ticker symbol increases by 1% or more. Instructions
below will lead you through setting up an applet on the IFTTT website. When the applet
trigger is called (which sends a web request received by the web server started
in this example), Cozmo will play an animation, speak the company name and the
percentage increase, and show a stock market image on his face.

Please place Cozmo on the charger for this example. When necessary, he will be
rolled off and back on.

Follow these steps to set up and run the example:
    1) Provide a a static ip, URL or similar that can be reached from the If This
        Then That server. One easy way to do this is with ngrok, which sets up
        a secure tunnel to localhost running on your machine.

        To set up ngrok:
        a) Follow instructions here to download and install:
            https://ngrok.com/download
        b) Run this command to create a secure public URL for port 8080:
            ./ngrok http 8080
        c) Note the HTTP forwarding address shown in the terminal (e.g., http://55e57164.ngrok.io).
            You will use this address in your applet, below.

        WARNING: Using ngrok exposes your local web server to the internet. See the ngrok
        documentation for more information: https://ngrok.com/docs

    2) Set up your applet on the "If This Then That" website.
        a) Sign up and sign into https://ifttt.com
        b) Create an applet: https://ifttt.com/create
        c) Set up your trigger.
            1. Click "this".
            2. Select "Stocks" as your service.
            3. Under "Choose a Trigger", select “Today's price rises by percentage".
            4. In section "Complete Trigger Fields", enter your ticker symbol and desired percentage,
                for instance:

                Ticker symbol: HOG
                Percentage increase: 1

            5. Click “Create Trigger".

        d) Set up your action.
            1. Click “that".
            2. Select “Maker Webhooks" to set it as your action channel. Connect to the Maker channel if prompted.
            3. Click “Make a web request" and fill out the fields as follows. Remember your publicly
                accessible URL from above (e.g., http://55e57164.ngrok.io) and use it in the URL field,
                followed by "/iftttStocks" as shown below:

                 URL: http://55e57164.ngrok.io/iftttStocks
                 Method: POST
                 Content Type: application/json
                 Body: {"PercentageChange":"{{PercentageChange}}","StockName":"{{StockName}}"}

            5. Click “Create Action" then “Finish".

    3) Test your applet.
        a) Run this script at the command line: ./ifttt_stocks.py
        b) On ifttt.com, on your applet page, click “Check now”. See that IFTTT confirms that the applet
            was checked.
        c) Wait for your stock to increase and see Cozmo react! Cozmo should roll off the charger, raise
            and lower his lift, announce the stock increase, and then show a stock market image on his face.


  
  1. import asyncio
  2. import sys
  3. try:
  4. from aiohttp import web
  5. except ImportError:
  6. sys.exit("Cannot import from aiohttp. Do `pip3 install --user aiohttp` to install")
  7. import cozmo
  8. from common import IFTTTRobot
  9. app = web.Application()
  10. async def serve_stocks(request):
  11. '''Define an HTTP POST handler for receiving requests from If This Then That.
  12. Controls how Cozmo responds to stock notification. You may modify this method
  13. to change how Cozmo reacts to the stock price increasing.
  14. '''
  15. json_object = await request.json()
  16. # Extract the company name for the stock ticker symbol.
  17. stock_name = json_object["StockName"]
  18. # Extract the percentage increase.
  19. percentage = str(json_object["PercentageChange"])
  20. robot = request.app['robot']
  21. async def read_name():
  22. try:
  23. async with robot.perform_off_charger():
  24. '''If necessary, Move Cozmo's Head and Lift to make it easy to see Cozmo's face.'''
  25. await robot.get_in_position()
  26. # First, have Cozmo play an animation
  27. await robot.play_anim_trigger(cozmo.anim.Triggers.ReactToPokeStartled).wait_for_completed()
  28. # Next, have Cozmo say that your stock is up by x percent.
  29. await robot.say_text(stock_name + " is up " + percentage + " percent").wait_for_completed()
  30. # Last, have Cozmo display a stock market image on his face.
  31. robot.display_image_file_on_face("../face_images/ifttt_stocks.png")
  32. except cozmo.RobotBusy:
  33. cozmo.logger.warning("Robot was busy so didn't read stock update: '"+ stock_name + " is up " + percentage + " percent'.")
  34. # Perform Cozmo's task in the background so the HTTP server responds immediately.
  35. asyncio.ensure_future(read_name())
  36. return web.Response(text="OK")
  37. # Attach the function as an HTTP handler.
  38. app.router.add_post('/iftttStocks', serve_stocks)
  39. if __name__ == '__main__':
  40. cozmo.setup_basic_logging()
  41. cozmo.robot.Robot.drive_off_charger_on_connect = False
  42. # Use our custom robot class with extra helper methods
  43. cozmo.conn.CozmoConnection.robot_factory = IFTTTRobot
  44. try:
  45. app_loop = asyncio.get_event_loop()
  46. sdk_conn = cozmo.connect_on_loop(app_loop)
  47. # Wait for the robot to become available and add it to the app object.
  48. app['robot'] = app_loop.run_until_complete(sdk_conn.wait_for_robot())
  49. except cozmo.ConnectionError as e:
  50. sys.exit("A connection error occurred: %s" % e)
  51. web.run_app(app)

Fin


 

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/86673649

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。