API Twitter сообщает мне «тип носителя не распознан». для изображений, которые всегда работали - PullRequest
0 голосов
/ 22 января 2020

Редактировать 2020-28-02: ошибка на стороне Twitter (спасибо за полезный комментарий ). Я продолжаю поднимать вопрос, несмотря на отрицательные голоса, потому что это может произойти снова, и это может быть полезно для других с той же ошибкой "тип носителя не распознан".

У меня небольшое приложение, я в качестве единственного пользователя, обновляющего мой тематический c твиттер ежедневно. При нажатии на кнопку каждый день из пула в 12 выкладывается одно изображение размером менее 5 МБ jpg. Теперь Твиттер говорит мне: «тип носителя не распознан».

Это одно из изображений .

Симптомы:

  • Я не могу загрузить одно и то же изображение в Twitter на веб-сайте. , Поэтому я предполагаю, что мои изображения были забанены при загрузке.
  • Я могу загрузить png-версию того же изображения на сайт, но не с помощью моего PHP программного обеспечения. И это странно.
  • Я могу загрузить другое изображение как из моего PHP сценария, так и на веб-сайте Twitter.

Я использую этот класс для своего PHP script

Единственная ошибка в моем журнале:

[22-Jan-2020 08:45:37 UTC] PHP Примечание: неопределенное свойство: stdClass: : $ media_id_string в /home/ABC/public_html/XYZ.php в строке 205

Это просто означает, что загрузка не удалась, поэтому Twitter API не ответил с идентификатором медиа (в эта точка равна NULL)

Это мой сценарий (вокруг этого есть logi c для определения текста и входа в систему):

require_once 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

define('CONSUMER_KEY', 'my consumer key');
define('CONSUMER_SECRET', 'my consumer secret');
define('ACCESS_TOKEN', 'my access token');
define('ACCESS_TOKEN_SECRET', 'my access secret');

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

$postfields = array(
    'media' => base64_encode(file_get_contents($image))
);

$media = $connection->upload('media/upload', ['media' => $image]);

$parameters = [
            'status' => 'my tweet text, never longer than 200 chars'
            'media_ids' => $media->media_id_string
];

$result = $connection->post('statuses/update', $parameters);

Повторюсь: это сработало без проблем месяцами я ничего не менял в нем. Он только начал публиковать текст без изображения.

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

  • Я восстановил свой токен доступа и секрет: ничего не изменилось
  • Я попробовал загрузку по частям: тот же результат
  • Я сделал новые файлы jpg с размером на 1 пиксель меньше, поэтому я обманул Twitter, это может быть другое изображение: это не обмануло twitter
  • Я пытался до sleep(1) после строки загрузки: это было нелогично и глупо с моей стороны (но я подумал, что загрузка может быть медленной, так как один из людей, имеющих такую ​​же проблему с javascript версией, решил ее так)

1 Ответ

0 голосов
/ 22 января 2020

Документация Твиттера гласит:

Убедитесь, что POST является запросом multipart / form-data. Либо загрузите необработанный двоичный файл (параметр носителя) файла, либо его закодированное в base64 содержимое (параметр media_data). По возможности используйте необработанный двоичный файл, поскольку кодирование base64 приводит к увеличению размера файла

Однако, похоже, вы загружаете содержимое в кодировке base64 при использовании параметра media. Попробуйте изменить параметр media на media_data.

Вероятно, это недавнее изменение или изменение, которое вступило в силу только недавно, поэтому оно работает раньше для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...