До сих пор я пытался обновить профиль twitter bg image tw twit api с php … и без успеха
Многие примеры в Интернете, в том числе:
Обновление фона Twitter через API
и этот
Загрузка фонового изображения Twitter с помощью API и данных с несколькими форматами
не работают вообще, большинство ppl выкидывают ответы без фактического тестирования кода.
Я обнаружил, что непосредственно отправьте изображение в форму twitter.com thr html, он будет работать:
<form action="http://twitter.com/account/update_profile_background_image.xml" enctype="multipart/form-data" method="post"> File: <input type="file" name="image" /><br/> <input type="submit" value="upload bg"> </form>
(хотя браузер подскажет вам имя пользователя и пароль учетной записи Twitter)
Однако, если я хочу перейти к одному и тому же процессу с php, он не работает
<?php if( isset($_POST["submit"]) ) { $target_path = ""; $target_path = $target_path . basename( $_FILES['myfile']['name']); if(move_uploaded_file($_FILES['myfile']['tmp_name'], $target_path)) { // "The file ". basename( $_FILES['myfile']['name']). " has been uploaded<br/>"; } else{ // "There was an error uploading the file, please try again!<br/>"; } $ch = curl_init('http://twitter.com/account/update_profile_background_image.xml'); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_USERPWD, $_POST['name'] . ':' . $_POST['pass']); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); curl_setopt($ch, CURLOPT_TIMEOUT, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => base64_encode(file_get_contents($target_path)))); $rsp = curl_exec($ch); echo "<pre>" . str_replace("<", "<", $rsp) . "</pre>"; } ?> <form enctype="multipart/form-data" method="post"> <input type="hidden" name="submit" value="1"/> name:<input type="text" name="name" value=""/><br/> pass:<input type="password" name="pass" value=""/><br/> File: <input type="file" name="myfile" /><br/> <input type="submit" value="upload bg"> </form>
Странная вещь этого кода заключается в том, что он успешно возвращает XML-твиттер, без обновления фонового изображения профиля. Поэтому в конце все еще не удается.
Большое спасибо за это. Будет здорово, если вы сможете помочь. Просьба сначала проконтролировать ваш код, прежде чем выкидывать ответы, много благодарностей.
Это то, что работает для меня (отладочные материалы остались):
$url = 'http://twitter.com/account/update_profile_background_image.xml'; $uname = 'myuname'; $pword = 'mypword'; $img_path = '/path/to/myimage.jpg'; $userpwd = $uname . ':' . $pword; $img_post = array('image' => '@' . $img_path . ';type=image/jpeg', 'tile' => 'true'); $opts = array(CURLOPT_URL => $url, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $img_post, CURLOPT_HTTPAUTH => CURLAUTH_ANY, CURLOPT_USERPWD => $userpwd, CURLOPT_HTTPHEADER => array('Expect:'), CURLINFO_HEADER_OUT => true); $ch = curl_init(); curl_setopt_array($ch, $opts); $response = curl_exec($ch); $err = curl_error($ch); $info = curl_getinfo($ch); curl_close($ch); echo '<pre>'; echo $err . '<br />'; echo '----------------' . '<br />'; print_r($info); echo '----------------' . '<br />'; echo htmlspecialchars($response) . '<br />'; echo '</pre>';
Подтвердили ли вы, что изображение, которое вы ожидаете, присутствует и отправляется (т. Е. Эхо из кодированных данных base64 для проверки)? Это GIF / PNG / JPG и ограничение 800 килобайт, установленное API?
Я думаю, что вы неправильно используете метод CURLOPT_POSTFIELDS. Вам нужно поставить и @ подписать полный путь к файлу в соответствии с документацией для curl PHP. Вы не должны выводить содержимое всего файла.
Полные данные для отправки в HTTP-режиме «POST». Чтобы опубликовать файл, добавьте имя файла с помощью @ и используйте полный путь. Это может быть либо передано как строка с urlencoded, как «para1 = val1 & para2 = val2 & …», или как массив с именем поля в качестве ключа и данных поля как значение. Если значением является массив, заголовок Content-Type будет установлен в multipart / form-data.
Это пример из документации.
<?php /* http://localhost/upload.php: print_r($_POST); print_r($_FILES); */ $ch = curl_init(); $data = array('name' => 'Foo', 'file' => '@/home/user/test.png'); curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_exec($ch); ?>
Надеюсь, это поможет.
Сейчас никто не может реально обновить фоновое изображение профиля или образ профиля. Twitter работает над устранением этой проблемы до тех пор, пока не будет исправлено.