Поделиться в Твиттере — перенаправляет параметр urlencode %2C на %252C

Я использую пользовательскую кнопку общего доступа в Твиттере «Создайте свою собственную кнопку твита» (https://dev.twitter.com/docs/tweet-button). В документации сказано, что я должен использовать параметры запроса для передачи параметров.

ПРОБЛЕМА: Twitter неправильно кодирует текстовый параметр, когда я передаю ему строку в кодировке URL. Запятая (,) отображается как %252C в сообщении твита. Другие символы также неправильно закодированы.

Я использую кодировку URL-адреса PHP (http://php.net/manual/en/function.urlencode.php), чтобы подготовить строку для вызова.

$text = urlencode("I just backed ". $project->getTitle().", an amazing new mobile app, on appbackr, where anyone can back mobile apps");

Затем я создаю ссылку на твиттер:

'http://www.twitter.com/share?url='.urlencode($projectUrl).'&via='.$via.'&text='.$text.'&related='.$user->getTwitterProfileName()

Последний вызов URL-адреса твиттера:

http://www.twitter.com/share?url=http%3A%2F%2Flocalhost%2Fapp%2Fbig-top-ballet&via=appbackr&text=I+just+backed+Big+Top+Ballet%2C+an+amazing+new+mobile+app%2C+on+appbackr%2C+where+anyone+can+back+mobile+apps&related=philippberner

Как только страница открывается в браузере (Chrome и Firefox), Twitter перенаправляет URL-адрес на:

https://twitter.com/intent/tweet?related=philippberner&text=I+just+backed+Big+Top+Ballet%252C+an+amazing+new+mobile+app%252C+on+appbackr%252C+where+anyone+can+back+mobile+apps&url=http%253A%252F%252Flocalhost%252Fapp%252Fbig-top-ballet&via=appbackr

Это отобразит следующее сообщение в окне твита:

Я только что поддержал Big Top Ballet%2C в потрясающем новом мобильном приложении%2C на appbackr%2C, где каждый может поддержать мобильные приложения через @appbackr

Он преобразует Top+Ballet%2C+an+amazing в Top+Ballet%252C+an+amazing. Запятая отображается правильно, когда я вручную меняю %252C на %2C в URL-адресе Twitter.


person philipp    schedule 04.01.2012    source источник


Ответы (2)


На самом деле, это не имеет ничего общего с кодировкой URL.

Это на самом деле работает с urlencode, с rawurlencode или даже без кодировки URL. Попробуйте следующие URL-адреса при открытии новой вкладки.

С urlEncode: http://twitter.com/share?url=http%3A%2F%2Fwww.appbackr.com%2Fapp%2Fglass-ceiling&via=appbackr&text=I+just+подложка+стекло+потолок%2C+потрясающее+новое+мобильное+приложение%2C+на+appbackr%2C+где+любой+может+назад+мобильные+приложения&related=

С помощью rawurlEncode: http://twitter.com/share?url=http%3A%2F%2Fwww.appbackr.com%2Fapp%2Fglass-ceiling&via=appbackr&text=I%20just%20backed%20Glass%20Ceiling%2C%20an%20amazing%20new%20mobile%20app%2C%20on%20appbackr%2C%20where%20anyone%20can%20back%20mobile%20apps&related=

Без urlEncode: http://twitter.com/share?url=http%3A%2F%2Fwww.appbackr.com%2Fapp%2Fglass-ceiling&via=appbackr&text=I только что поддержал Glass Ceiling, удивительную новинку мобильное приложение на appbackr, где каждый может поддержать мобильные приложения&related=

Хитрость на самом деле заключается в использовании twitter.com вместо www.twitter.com. Не уверен, почему есть разница, и, похоже, она нигде не задокументирована ни в документации Twitter, ни в результатах поиска Google. Хотя, справедливости ради, документация Twitter действительно указывает на twitter.com, а не на www.twitter. ком.

Как всегда, лучше всего всегда кодировать текст с помощью urlencode, даже если он работает без кодирования URL.

person henrybai    schedule 17.01.2012

Использовать:

$text = rawurlencode("I just backed ". $project->getTitle().", an amazing new mobile app, on appbackr, where anyone can back mobile apps");

Затем используйте этот URL-адрес: 'https://twitter.com/intent/tweet?url='.urlencode($projectUrl).'&via='.$via.'&text='.$text.'&related='. $user->getTwitterProfileName()

person Darm    schedule 04.01.2012
comment
С rawurlencode я получаю даже пустые места в URL-адресе. Я пробовал это раньше. Разница как я понимаю в кодировке пробела. Они не являются причиной проблемы. Тогда сообщение в твиттере выглядит так: I%20just%20backed%20Big%20Top%20Ballet%2C%20an%20amazing%20new%20mobile%20app%2C%20on%20appbackr%2C%20where%20anyone%20can%20back%20mobile%20apps через @appbackr - person philipp; 04.01.2012
comment
Это ошибка в перезаписи URL-адреса twitter API, он снова кодирует данные GET, когда перенаправляет URL-адрес twitter.com/share на twitter.com/intent/tweet. Используйте этот последний URL. Вы также должны использовать rawurlencode вместо urlencode. - person Darm; 04.01.2012