[YandexZenBridge] Fix broken bridge for some channels (#4078)

Fixes #4071.

Major changes:
- the bridge's URI changed from zen.yandex.com to dzen.ru, as the former
  redirects to the latter (perhaps the bridge's name should be changed
  as well);
- the channel's URL is now required instead of the channel's username;
- two kinds of URLs are supported, one for channels with usernames and
  one for channels with IDs in their URL;
- the channel's real name, as shown in the webpage, is now used as the
  feed title.
This commit is contained in:
llamasblade 2024-04-14 17:14:52 +00:00 committed by GitHub
parent b4d397ff70
commit 957a820931
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3,17 +3,17 @@
class YandexZenBridge extends BridgeAbstract class YandexZenBridge extends BridgeAbstract
{ {
const NAME = 'YandexZen Bridge'; const NAME = 'YandexZen Bridge';
const URI = 'https://zen.yandex.com'; const URI = 'https://dzen.ru';
const DESCRIPTION = 'Latest posts from the specified profile.'; const DESCRIPTION = 'Latest posts from the specified channel.';
const MAINTAINER = 'llamasblade'; const MAINTAINER = 'llamasblade';
const PARAMETERS = [ const PARAMETERS = [
[ [
'username' => [ 'channelURL' => [
'name' => 'Username', 'name' => 'Channel URL',
'type' => 'text', 'type' => 'text',
'required' => true, 'required' => true,
'title' => 'The account\'s username, found in its URL', 'title' => 'The channel\'s URL',
'exampleValue' => 'dream_faity_diy', 'exampleValue' => 'https://dzen.ru/dream_faity_diy',
], ],
'limit' => [ 'limit' => [
'name' => 'Limit', 'name' => 'Limit',
@ -27,14 +27,41 @@ class YandexZenBridge extends BridgeAbstract
]; ];
# credit: https://github.com/teromene see #1032 # credit: https://github.com/teromene see #1032
const _API_URL = 'https://zen.yandex.ru/api/v3/launcher/more?channel_name='; const _BASE_API_URL_WITH_CHANNEL_NAME = 'https://dzen.ru/api/v3/launcher/more?channel_name=';
const _BASE_API_URL_WITH_CHANNEL_ID = 'https://dzen.ru/api/v3/launcher/more?channel_id=';
const _ACCOUNT_URL_WITH_CHANNEL_ID_REGEX = '#^https?://dzen\.ru/id/(?<channelID>[a-z0-9]{24})#';
const _ACCOUNT_URL_WITH_CHANNEL_NAME_REGEX = '#^https?://dzen\.ru/(?<channelName>[\w\.]+)#';
private $channelRealName = null; # as shown in the webpage, not in the URL
public function collectData() public function collectData()
{ {
$profile_json = json_decode(getContents($this->getAPIUrl())); $channelURL = $this->getInput('channelURL');
if (preg_match(self::_ACCOUNT_URL_WITH_CHANNEL_ID_REGEX, $channelURL, $matches)) {
$channelID = $matches['channelID'];
$channelAPIURL = self::_BASE_API_URL_WITH_CHANNEL_ID . $channelID;
} elseif (preg_match(self::_ACCOUNT_URL_WITH_CHANNEL_NAME_REGEX, $channelURL, $matches)) {
$channelName = $matches['channelName'];
$channelAPIURL = self::_BASE_API_URL_WITH_CHANNEL_NAME . $channelName;
} else {
returnClientError(<<<EOT
Invalid channel URL provided.
The channel\'s URL must be in one of these two forms:
- https://dzen.ru/dream_faity_diy
- https://dzen.ru/id/5ad7777f1aa80ce576015250
EOT);
}
$APIResponse = json_decode(getContents($channelAPIURL));
$this->channelRealName = $APIResponse->header->title;
$limit = $this->getInput('limit'); $limit = $this->getInput('limit');
foreach (array_slice($profile_json->items, 0, $limit) as $post) { foreach (array_slice($APIResponse->items, 0, $limit) as $post) {
$item = []; $item = [];
$item['uri'] = $post->share_link; $item['uri'] = $post->share_link;
@ -56,21 +83,19 @@ class YandexZenBridge extends BridgeAbstract
} }
} }
private function getAPIUrl()
{
return self::_API_URL . $this->getInput('username');
}
public function getURI() public function getURI()
{ {
return self::URI . '/' . $this->getInput('username'); if (is_null($this->getInput('channelURL'))) {
return parent::getURI();
}
return $this->getInput('channelURL');
} }
public function getName() public function getName()
{ {
if (is_null($this->getInput('username'))) { if (is_null($this->channelRealName)) {
return parent::getName(); return parent::getName();
} }
return $this->getInput('username') . '\'s latest zen.yandex posts'; return $this->channelRealName . '\'s latest zen.yandex posts';
} }
} }