使用 twitter 调用变量 api

Calling variables with twitter api

我一直在研究气象站,我希望它能够自动 post 当前天气到 Twitter。到目前为止,我已经能够轻松地 post 常规字符串,例如 t.statuses.update(status= 'twitter post!') 但是每当我尝试 post 一个变量,例如当前温度,我都会得到这个错误:

Traceback (most recent call last): File "/home/pi/Desktop/Python2Projects/MAIN.py", line 79, in t.statuses.update (status= 'Current temperature in dowd house: %d F \n Windspeed: %d mph' %(temp, vmph) ) AttributeError: 'int' object has no attribute 'statuses'

到目前为止,这是我的代码,twitter post 行在最底部:

#sets up libraries
from sys import argv
import os
import glob
import subprocess
import RPi.GPIO as GPIO
import time
import datetime

#Sets up twitter library
from twitter import *
access_token = 'secret'
access_token_secret = 'cant tell you'
consumer_key = 'i have to change all these'
consumer_secret = 'they usually have my twitter access keys'
t = Twitter(auth=OAuth(access_token, access_token_secret, consumer_key,     consumer_secret))

#sets up GPIO for windspeed Hall effect sensor
GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.IN)

#sets up GPIO for temperature probe
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'


#usus probe to take temperature
def read_temp_raw():
    catdata = subprocess.Popen(['cat',device_file],    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out,err = catdata.communicate()
    out_decode = out.decode('utf-8')
    lines = out_decode.split('\n')
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return float(temp_f) #float(temp_c)
temp = read_temp()

#setup for windspeed sensor
timy = datetime.datetime.now()
timx = datetime.datetime.now()
rotations = 0
#radious of windspeed sensor in meters
r = .1
#time in seconds you want sensor to collect data for average speed
t = 5

#main windspeed loop
timeout = time.time() + t
while True:
    GPIO.wait_for_edge(27, GPIO.BOTH)
    hallActive = GPIO.input(27)

    if time.time() > timeout:
        break
    elif( hallActive == False ):
        rotations = rotations + 1
    elif( hallActive == True ):
        pass

#function that converts rotations/s to mph
vmph = (r*6.28*rotations*2.2369) / t

GPIO.cleanup()

print 'Current temperature: %d F \n Windspeed: %d mph \n' %(temp, vmph)

t.statuses.update (status= 'Current temperature: %d F \n Windspeed: %d mph' %(temp, vmph) ) 

代码结束

非常感谢您的帮助或建议!非常感谢。

您遇到此问题是因为您在此处将 t 分配给值 5

#time in seconds you want sensor to collect data for average speed
t = 5

在那之后,您尝试执行 t.statues,但这当然行不通,因为 t 是一个整数而不是对 twitter api 的引用。

解决此问题的简单方法是更改​​脚本顶部的 twitter api 句柄的名称:

twitter_api = Twitter(auth=OAuth(access_token,
                                 access_token_secret,
                                 consumer_key, consumer_secret))

然后在底部相应地调整您的代码:

temp_line = 'Current temperature: %d F \n Windspeed: %d mph \n' %(temp, vmph) 

print(temp_line)

twitter_api.statuses.update(status=temp_line) 

作为一般规则,尽量避免使用单字符命名变量。它们只会给您的代码增加混乱(如本例所示),而且它们使您的代码在将来难以维护(对于您或任何其他必须维护它的人)。

Python 提供了一个出色的风格指南,称为 PEP-8,其中包含一些关于如何格式化代码的指南。