2015-06-23 3 views
0

Я пытаюсь следовать учебнику, чтобы сделать Reddit и Twitter бот в Python. Я использовал Python (2.7.10), как я считаю, что была версия, используемая в учебнике, однако у меня есть следующие ошибки:Python (2.7.10): Ключ Ошибка: 'id'

Traceback (most recent call last): 
    File "C:\Python27\twitterbot.py", line 82, in <module> 
     main() 
    File "C:\Python27\twitterbot.py", line 63, in main 
     post_dict, post_ids = tweet_creator(subreddit) 
    File "C:\Python27\twitterbot.py", line 30, in tweet_creator 
     short_link = shorten(post_link) 
    File "C:\Python27\twitterbot.py", line 46, in shorten 
     link = json.loads(r.text)['id'] 
     KeyError: 'id' 

Полный сценарий можно увидеть ниже (маркеры и ключи удалены):

import praw 
import json 
import requests 
import tweepy 
import time 

access_token = 'REMOVED' 
access_token_secret = 'REMOVED' 
consumer_key = 'REMOVED' 
consumer_secret = 'REMOVED' 

def strip_title(title): 
    if len(title) < 94: 
     return title 
    else: 
     return title[:93] + "..." 

def tweet_creator(subreddit_info): 
    post_dict = {} 
    post_ids = [] 
    print "[Computer] Getting posts from Reddit" 
    for submission in subreddit_info.get_hot(limit=20): 
     post_dict[strip_title(submission.title)] = submission.url 
     post_ids.append(submission.id) 
    print "[Computer] Generating short link using goo.gl" 
    mini_post_dict = {} 
    for post in post_dict: 
     post_title = post 
     post_link = post_dict[post]   
     short_link = shorten(post_link) 
     mini_post_dict[post_title] = short_link 
    return mini_post_dict, post_ids 

def setup_connection_reddit(subreddit): 
    print "[Computer] setting up connection with Reddit" 
    r = praw.Reddit('yasoob_python reddit twitter Computer ' 
       'monitoring %s' %(subreddit)) 
    subreddit = r.get_subreddit(subreddit) 
    return subreddit 

def shorten(url): 
    headers = {'content-type': 'application/json'} 
    payload = {"longUrl": url} 
    url = "https://www.googleapis.com/urlshortener/v1/url" 
    r = requests.post(url, data=json.dumps(payload), headers=headers) 
    link = json.loads(r.text)['id'] 
    return link 

def duplicate_check(id): 
    found = 0 
    with open('posted_posts.txt', 'r') as file: 
     for line in file: 
      if id in line: 
       found = 1 
    return found 

def add_id_to_file(id): 
    with open('posted_posts.txt', 'a') as file: 
     file.write(str(id) + "\n") 

def main(): 
    subreddit = setup_connection_reddit('showerthoughts') 
    post_dict, post_ids = tweet_creator(subreddit) 
    tweeter(post_dict, post_ids) 

def tweeter(post_dict, post_ids): 
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_token, access_token_secret) 
    api = tweepy.API(auth) 
    for post, post_id in zip(post_dict, post_ids): 
     found = duplicate_check(post_id) 
     if found == 0: 
      print "[Computer] Posting this link on twitter" 
      print post+" "+post_dict[post]+" #Python #reddit #Computer" 
      api.update_status(post+" "+post_dict[post]+" #Python #reddit #Computer") 
      add_id_to_file(post_id) 
      time.sleep(30) 
     else: 
      print "[Computer] Already posted" 

if __name__ == '__main__': 
    main() 
+0

Взгляните на это [SO вопрос] [1] [1]: http://stackoverflow.com/questions/24816114/keyerror-when-key-exists – TM89

+0

Я пытаюсь сделать это связанным с моей проблемой, но не слишком хорошо. Будем продолжать, спасибо. – user2183587

+0

Какие ключи доступны в разобранном json ('json.loads (r.text) .keys()')? –

ответ

0

Я встретил некоторую аналогичную проблему, но я не уверен, что это та же проблема. Из PRAW 3.0 класс Redditor использует функцию lazyload, которая была использована для класса Subreddit в PRAW 2.x. Вы можете использовать assert (redditor.has_fetched) , чтобы проверить, что объект загружен или нет.

Специфично для класса Redditor, как «id», так и «name» являются атрибутами lazyload и одинаковыми для некоторых других атрибутов, таких как «link_karma». Я запрашиваю их непосредственно перед как: Варса (пользователи Reddit) [ «ID»] Он работал на Praw 2.x и сообщил об ошибке для Praw 3.0 Моего Фикса вызов: redditor.link_karma , чтобы загрузить все функции.