我正在使用linux并将文件放在终端的底部。 我收到以下错误:
Impossible d'ouvrir le fichier Traceback(最近一次调用最后一次): 文件“TR5.py”,第131行,in 主(sys.argv中[1:]) 在主要文件中输入“TR5.py”,第75行 对于文件中的行: UnboundLocalError:赋值前引用的局部变量'file'
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#################################################################################
#NAME: TR5 // TWITTER AUTOREPORTER 5.0 #
#OP: #opIceISIS // #opFocalpoint #
# #
#USAGE: $ cd YOUR_DOWNLOAD_FOLDER #
# $ python TR5.py -u TWITTER_USERNAME -i TWITTER_URL_ONLY_TARGETSLIST.txt #
#################################################################################
from splinter import Browser
import sys, getopt, re
from datetime import datetime
from splinter.request_handler.status_code import HttpResponseError
import time
def main(argv):
d = datetime.now()
date = str(d.year) + '' + str(d.month) + '' + str(d.day) + '' + str(d.hour) + '' + str(d.minute) + '' + str(d.second)
try:
opts, args = getopt.getopt(argv,"hi:u:",["file=","user="])
except getopt.GetoptError:
print 'twitterReport.py -u <Twitter username> -i <file>'
print 'Le fichier des profiles doit comporter une URL par ligne ++'
# sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print 'twitterReport.py -u <Twitter username> -i <file.txt>'
print 'Le fichier des profiles doit comporter une URL par ligne'
sys.exit()
elif opt in ("-i", "--file"):
txt = arg
elif opt in ("-u", "--user"):
username = arg
password = raw_input("Enter your twitter password : ")
try:
username
txt
except getopt.GetoptError:
print 'twitterReport.py -u <Twitter username> -i <file>'
print 'Le fichier des profiles doit comporter une URL par ligne'
# sys.exit()
# uncomment if you want to use privoxy + tor
# proxyIP = '127.0.0.1'
# proxyPort = 8118
#
# proxy_settings = {'network.proxy.type': 1,
# 'network.proxy.http': proxyIP,
# 'network.proxy.http_port': proxyPort,
# 'network.proxy.ssl': proxyIP,
# 'network.proxy.ssl_port':proxyPort,
# 'network.proxy.socks': proxyIP,
# 'network.proxy.socks_port':proxyPort,
# 'network.proxy.ftp': proxyIP,
# 'network.proxy.ftp_port':proxyPort
# }
#
# with Browser('firefox',profile_preferences=proxy_settings) as browser:
# with Browser() as browser:
with Browser() as browser:
browser.visit("https://twitter.com/")
browser.execute_script('document.getElementById("signin-email").value = "'+username+'"')
browser.execute_script('document.getElementById("signin-password").value = "'+password+'"')
browser.find_by_css('button[type="submit"].submit.btn.primary-btn').click()
try:
file = open(txt, 'r')
except:
print "Impossible d'ouvrir le fichier"
for line in file:
try:
url = re.match(r"https?://(www\.)?twitter\.com/intent/(#!/)?@?([^/\s]*)",line.strip())
url = url.group()
browser.visit(url)
if not browser.is_element_present_by_css('.route-account_suspended'):
browser.find_by_css('a.fn.url.alternate-context').click()
browser.find_by_css('.user-dropdown').click()
browser.find_by_css('li.report-text button[type="button"]').click()
time.sleep(2)
# browser.choose('input[type="radio"][value="spam"]').click(1)
# browser.find_by_css('.input[type="radio"][value="spam"]')[1].click()
# browser.find_element_by_xpath(".//label")[1].click()
# browser.find_elements_by_css_selector('.input[type="radio"][value="spam"]')[1].click()
# browser.find_by_css('label.spam [type="radio"]').click()
# browser.choose("spam")[1].click()
# browser.find_elements_by_xpath(".//input[@type='radio' and @value='spam']")[0].click()
browser.find_by_css('button.btn.primary-btn.new-report-flow-next-button[type="button"]')[0].click()
time.sleep(2)
browser.find_by_css('button.btn.primary-btn.new-report-flow-done-button[type="button"]')[0].click()
# browser.find_by_css('button.btn.primary-btn:nth-child(1)').click()
followers = browser.find_by_css('a[data-nav="followers"] .ProfileNav-value').value;
msg = url.strip()
with open("log_reported_"+date+".txt", "a") as log:
log.write(msg+"\n")
elif browser.is_element_present_by_css('.route-account_suspended'):
msg = line.strip()+' - Suspended'
with open("log_suspended.txt", "a") as log:
log.write(msg+"\n")
else:
msg = line.strip()+' - Unknown'
with open("log_unknown.txt", "a") as log:
log.write(msg+"\n")
print msg
except KeyboardInterrupt:
print 'Quit by keyboard interrupt sequence !'
break
except HttpResponseError:
msg = line.strip()+' - HttpResponseError'
print msg
with open("log_Error.txt", "a") as log:
log.write(msg+"\n")
pass
except:
if line:
msg = url.strip()+' - CatchAllError'
print msg
with open("log_Error.txt", "a") as log:
log.write(msg+"\n")
else:
pass
if __name__ == "__main__":
try:
main(sys.argv[1:])
except KeyboardInterrupt:
sys.stdout.write('\nQuit by keyboard interrupt sequence !')
答案 0 :(得分:1)
第75行是for line in file:
,因此看起来file = open(txt, 'r')
引发了异常。它打印出“Impossible d'ouvrir le fichier”然后继续,没有定义file
变量。您的文件可能已锁定或不存在。
我至少会将第73行更改为此,因此您可以看到它尝试打开的文件的名称:
print "Impossible d'ouvrir le fichier:", txt
答案 1 :(得分:1)
try:
file = open(txt, 'r')
except:
print "Impossible d'ouvrir le fichier"
return # <-- finish function
for line in file:
程序无法打开文件,但您尝试从该文件中读取行。
您可以在return
之后添加print
来完成功能和程序。
答案 2 :(得分:0)
尽管抛出了未打开文件的异常,但您正试图遍历文件的行。试试这个:
try:
file = open(txt, 'r')
except:
sys.exit("Impossible d'ouvrir le fichier")
然后,如果打开失败,脚本将停止。
答案 3 :(得分:0)
这是你的问题:
try:
file = open(txt, 'r')
except:
print "Impossible d'ouvrir le fichier"
for line in file:
# etc
如果打开文件时出错,则永远不会定义变量file
。然而,即使出现错误,您仍然会进入for
循环,因为file
未定义而抱怨。
有很多方法可以解决这个问题。一种方法是在file
块中将变量None
设置为except
,然后在循环之前使用if file:
。您也可以在return
块中的函数中except
,因为如果无法打开文件,则无法执行任何操作。
顺便说一句,您应该捕获可能的最具体的异常(例如except IOError:
),而不是使用裸except:
来避免捕获您不想捕获的异常。
答案 4 :(得分:0)
尝试twitter autoreporter的优化(也可以)版本:https://ghostbin.com/paste/mr7yf
答案 5 :(得分:0)
您需要做的就是命名目标列表文件file.txt
然后转到终端:
python TR5.py -u <@username> -i <file.txt>