code.py
 1  # SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries
 2  # SPDX-License-Identifier: MIT
 3  
 4  import os
 5  import re
 6  import time
 7  import ssl
 8  import wifi
 9  import socketpool
10  import microcontroller
11  import adafruit_requests
12  
13  #  enter the hashtag that you want to follow
14  hashtag = "CircuitPython"
15  
16  #  connect to SSID
17  wifi.radio.connect(os.getenv('WIFI_SSID'), os.getenv('WIFI_PASSWORD'))
18  
19  #  add your mastodon token as 'mastodon_token' to your .env file
20  headers = {'Authorization': 'Bearer ' + os.getenv('mastodon_token') + 'read:statuses'}
21  
22  pool = socketpool.SocketPool(wifi.radio)
23  requests = adafruit_requests.Session(pool, ssl.create_default_context())
24  
25  #  initial request, gets most recent matching hashtag post
26  #  add your mastodon instance (mastodon.social, tech.lgbt, etc) to your .env file as mastodon_host
27  r = requests.get("https://%s/api/v1/timelines/tag/%s?limit=1" % (os.getenv('mastodon_host'), hashtag), headers=headers) # pylint: disable=line-too-long
28  json_data = r.json()
29  post_id = str(json_data[0]['id'])
30  print("A new #%s post from @%s:" % (hashtag, str(json_data[0]['account']['acct'])))
31  print(re.sub('<[^>]+>', '', json_data[0]['content']))
32  print()
33  
34  while True:
35      try:
36          time.sleep(360)
37          # compares post_id to see if a new post to the hashtag has been found
38          r = requests.get("https://%s/api/v1/timelines/tag/%s?since_id=%s" % (os.getenv('mastodon_host'), hashtag, post_id), headers=headers) # pylint: disable=line-too-long
39          json_data = r.json()
40          json_length = len(json_data)
41          # if the id's match, then the json array is empty (length of 0)
42          # otherwise there is a new post
43          if json_length > 0:
44              post_id = str(json_data[0]['id'])
45              print("A new #%s post from @%s:" % (hashtag, str(json_data[0]['account']['acct'])))
46              print(re.sub('<[^>]+>', '', json_data[0]['content']))
47              print()
48          else:
49              print("no new #%s posts" % hashtag)
50              print(json_length)
51              print()
52  
53      except Exception as e:  # pylint: disable=broad-except
54          print("Error:\n", str(e))
55          print("Resetting microcontroller in 10 seconds")
56          time.sleep(10)
57          microcontroller.reset()