2013-08-27 50 views
0

我在嘗試上傳照片到Facebook頁面的腳本時遇到了一些麻煩。只有通過字符串時,它才能正常工作。頁面文章需要源文件(圖片),這是我遇到的問題。這將返回一個400錯誤。發送文件python

我不完全知道如何處理圖像(和我們的目標是做這個是大頭,所以我非常喜歡圖像的壓縮文件。)

這裏是相當於捲曲請求正常工作: 捲曲-F '=消息簿號碼://bit.ly/alaska' -F '[email protected]' -F '出版= 0' -F '=的access_token TEST' https://graph.facebook.com/act_id/photos

import os 
import requests 
import csv 
import time 
import thread 
import zipfile 
from datetime import datetime 
from json import JSONEncoder 
from flask import Flask, request, redirect, url_for, send_from_directory, \ 
        render_template 
from flask.ext.mail import Mail, Message 
from werkzeug import secure_filename 


email = '' 
token='' 
pageid = '' 
filename = 'test.csv' 
images = 'test.zip' 
from flask import request 

raw_input = open(filename, 'rb') 
info = csv.DictReader(raw_input) 
imagefile = zipfile.ZipFile(images, mode='r')   
creation_date = datetime.now().strftime('%m-%d-%Y') 
output_csv_name = \ 
    "unpublished_posts_%s_%s.csv" % (pageid, creation_date) 
output_csv = open(output_csv_name, 'wb') 
writer = csv.writer(output_csv, quoting=csv.QUOTE_NONNUMERIC) 
writer.writerow(('message', 
    'source', 
    'published', 
    'scheduled_publish_time', 
    'genders', 
    'age_max', 
    'age_min', 
    'countries', 
    'regions', 
    'cities', 
    'relationship_statuses', 
    'interested_in', 
    'locales', 
    'education_statuses', 
    'work_networks', 
    'college_networks', 
    'college_majors', 
    'college_years', 
    'post_id' 
    )) 

posts = [] 
targeting_params = ['genders', 
    'age_max', 
    'age_min', 
    'countries', 
    'regions', 
    'cities', 
    'relationship_statuses', 
    'interested_in', 
    'locales', 
    'education_statuses', 
    'work_networks', 
    'college_networks', 
    'college_majors', 
    'college_years'] 

for idx, row in enumerate(list(info)): 
    # convert date string to unix time-stamp 
    if row['scheduled_publish_time'] <> '': 
     s = row['scheduled_publish_time'] 
     timestamp = \ 
        time.mktime(datetime.strptime(s, "%d/%m/%Y").timetuple()) 
       row['scheduled_publish_time'] = timestamp 

    post_params = [s for s in row.keys() if s not in targeting_params] 
    post_params.append('targeting') 

    for param in targeting_params: 
     if len(row[param]) > 0: 
      row[param] = row[param].split(",") 

    targeting_dict = {k: row[k] for k in targeting_params} 
    targeting_dict = dict([(k, v) for k, v in targeting_dict.items() \ 
            if len(v) > 0]) 
    row['targeting'] = JSONEncoder().encode(targeting_dict) 

    row = {k: row[k] for k in post_params} 
    row = dict([(k, v) for k, v in row.items() if len(v) > 0]) 

    message = row['message'] 
    row[u'message'] = u''.join(unichr(ord(c)) for c in row['message']) 

    imagename = row[u'source'] 
    imagedata = imagefile.extract(imagename) 
    files = {'source': open(imagedata, 'rb')} 
    api_method = 'https://graph.facebook.com/%s/feed?access_token=%s' 
    response = requests.post(api_method % (pageid, token),params=row,files=files) 

對不起,如果不夠清楚。不知道什麼是相關的,什麼不相關。我之前工作的腳本中所做的所有更改都是在請求中添加了「文件」,所以我很確定這是我犯了錯誤的地方。

謝謝!

回答

1

試試這個:

files = { 'source': imagedata }

基本上就無法打開()imagedata這已經是一個字符串(開放()僅適用於文件),所以你只要提交原樣和要求將負責多部分編碼。

另請參閱this關於使用請求進行文件上傳的問題。

+0

您可以使用[StringIO](http://docs.python.org/2/library/stringio.html)打開一個字符串作爲文件。 – korylprince