前言
这是我在stackoverflow上的第一篇文章,所以如果我在某个地方搞砸了,我很抱歉。我搜索了互联网和stackoverflow寻找解决我的问题的方法,但我什么也没找到。在
形势
我正在做的是用我的树莓皮制作一个数码相框,它还可以自动从我妻子的facebook页面下载图片。幸运的是,我发现有人在做类似的事情:
一个月前这位先生添加了下载_脸谱网.py脚本。这就是我需要的!所以几天前,我开始编写这个脚本,首先让它在我的windows环境中工作(在我把它放到pi上之前)。不幸的是,没有专门针对该脚本的文档,而且我缺乏python经验。在
基于from urllib import urlopen语句,我可以假设这个脚本是为python2.x编写的,这是因为python3.x现在是from urlib import request。在
所以我安装了Python2.7.9解释器,与尝试使用Python3.4.3解释器相比,我遇到的问题更少。在
问题
我已经得到了从facebook帐户下载图片的脚本;但是,图片被破坏了。在
现在,我最初使用的是python3.4.3,但我的方法urlrequest(url)(请参阅post底部的代码)以及它如何处理图像数据。我尝试过用不同的格式解码,比如utf-8和utf-16,但是根据内容头,它显示的是utf-8格式(我想)。在
结论
我不太确定问题是下载图像还是将图像写入文件。在
如果有人能帮助我,我将永远感激!也让我知道我可以做些什么来改善我的职位。在
提前谢谢。在
代码from urllib import urlopen
from json import loads
from sys import argv
import dateutil.parser as dateparser
import logging
# plugin your username and access_token (Token can be get and
# modified in the Explorer's Get Access Token button):
# https://graph.facebook.com/USER_NAME/photos?type=uploaded&fields=source&access_token=ACCESS_TOKEN_HERE
FACEBOOK_USER_ID = "**USER ID REMOVED"
FACEBOOK_ACCESS_TOKEN = "** TOKEN REMOVED - GET YOUR OWN **"
def get_logger(label='lvm_cli', level='INFO'):
"""
Return a generic logger.
"""
format = '%(asctime)s - %(levelname)s - %(message)s'
logging.basicConfig(format=format)
logger = logging.getLogger(label)
logger.setLevel(getattr(logging, level))
return logger
def urlrequest(url):
"""
Make a url request
"""
req = urlopen(url)
data = req.read()
return data
def get_json(url):
"""
Make a url request and return as a JSON object
"""
res = urlrequest(url)
data = loads(res)
return data
def get_next(data):
"""
Get next element from facebook JSON response,
or return None if no next present.
"""
try:
return data['paging']['next']
except KeyError:
return None
def get_images(data):
"""
Get all images from facebook JSON response,
or return None if no data present.
"""
try:
return data['data']
except KeyError:
return []
def get_all_images(url):
"""
Get all images using recursion.
"""
data = get_json(url)
images = get_images(data)
next = get_next(data)
if not next:
return images
else:
return images + get_all_images(next)
def get_url(userid, access_token):
"""
Generates a useable facebook graph API url
"""
root = 'https://graph.facebook.com/'
endpoint = '%s/photos?type=uploaded&fields=source,updated_time&access_token=%s' % \
(userid, access_token)
return '%s%s' % (root, endpoint)
def download_file(url, filename):
"""
Write image to a file.
"""
data = urlrequest(url)
path = 'C:/photos/%s' % filename
f = open(path, 'w')
f.write(data)
f.close()
def create_time_stamp(timestring):
"""
Creates a pretty string from time
"""
date = dateparser.parse(timestring)
return date.strftime('%Y-%m-%d-%H-%M-%S')
def download(userid, access_token):
"""
Download all images to current directory.
"""
logger = get_logger()
url = get_url(userid, access_token)
logger.info('Requesting image direct link, please wait..')
images = get_all_images(url)
for image in images:
logger.info('Downloading %s' % image['source'])
filename = '%s.jpg' % create_time_stamp(image['created_time'])
download_file(image['source'], filename)
if __name__ == '__main__':
download(FACEBOOK_USER_ID, FACEBOOK_ACCESS_TOKEN)