deactivate social avatars from twitter
Signed-off-by: call-me-matt <nextcloud@matthiasheinisch.de>
This commit is contained in:
parent
cecab50d2d
commit
82fde0e121
|
@ -1 +0,0 @@
|
|||
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="twitter" class="svg-inline--fa fa-twitter fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>
|
Before Width: | Height: | Size: 1.0 KiB |
|
@ -32,7 +32,6 @@ class CompositeSocialProvider {
|
|||
|
||||
public function __construct(InstagramProvider $instagramProvider,
|
||||
MastodonProvider $mastodonProvider,
|
||||
TwitterProvider $twitterProvider,
|
||||
// FacebookProvider $facebookProvider,
|
||||
TumblrProvider $tumblrProvider,
|
||||
DiasporaProvider $diasporaProvider,
|
||||
|
@ -43,8 +42,7 @@ class CompositeSocialProvider {
|
|||
$this->providers = [
|
||||
$instagramProvider->name => $instagramProvider,
|
||||
$mastodonProvider->name => $mastodonProvider,
|
||||
$twitterProvider->name => $twitterProvider,
|
||||
// $facebookProvider->name => $facebookProvider,
|
||||
// $facebookProvider->name => $facebookProvider,
|
||||
$tumblrProvider->name => $tumblrProvider,
|
||||
$diasporaProvider->name => $diasporaProvider,
|
||||
$xingProvider->name => $xingProvider,
|
||||
|
|
|
@ -25,7 +25,6 @@ namespace OCA\Contacts\Service\Social;
|
|||
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
use GuzzleHttp\RequestOptions;
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OCA\Contacts\AppInfo\Application;
|
||||
use OCP\Http\Client\IClientService;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
@ -127,7 +126,6 @@ class TelegramProvider implements ISocialProvider {
|
|||
try {
|
||||
$result = $this->httpClient->get($url, [
|
||||
RequestOptions::HEADERS => [
|
||||
// Make the request as google bot so twitter display the full static html page
|
||||
'User-Agent' => 'Googlebot/2.1'
|
||||
]
|
||||
]);
|
||||
|
|
|
@ -1,156 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2020 Matthias Heinisch <nextcloud@matthiasheinisch.de>
|
||||
*
|
||||
* @author Matthias Heinisch <nextcloud@matthiasheinisch.de>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Contacts\Service\Social;
|
||||
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
use GuzzleHttp\RequestOptions;
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OCA\Contacts\AppInfo\Application;
|
||||
use OCP\Http\Client\IClientService;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class TwitterProvider implements ISocialProvider {
|
||||
/** @var IClientService */
|
||||
private $httpClient;
|
||||
|
||||
/** @var LoggerInterface */
|
||||
private $logger;
|
||||
|
||||
/** @var string */
|
||||
public $name = 'twitter';
|
||||
|
||||
public function __construct(IClientService $httpClient,
|
||||
LoggerInterface $logger) {
|
||||
$this->httpClient = $httpClient->NewClient();
|
||||
$this->logger = $logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if this provider supports this contact
|
||||
*
|
||||
* @param {array} contact info
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function supportsContact(array $contact):bool {
|
||||
if (!array_key_exists('X-SOCIALPROFILE', $contact)) {
|
||||
return false;
|
||||
}
|
||||
$socialprofiles = $this->getProfileIds($contact);
|
||||
return isset($socialprofiles) && count($socialprofiles) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the profile-picture url
|
||||
*
|
||||
* @param {array} contact information
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getImageUrls(array $contact):array {
|
||||
$profileIds = $this->getProfileIds($contact);
|
||||
$urls = [];
|
||||
foreach ($profileIds as $profileId) {
|
||||
$recipe = 'https://twitter.com/{socialId}';
|
||||
$connector = str_replace('{socialId}', $profileId, $recipe);
|
||||
$connector = $this->getFromHtml($connector, 'profile_image');
|
||||
$urls[] = $connector;
|
||||
}
|
||||
return $urls;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the profile-id
|
||||
*
|
||||
* @param {string} the value from the contact's x-socialprofile
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function cleanupId(string $candidate):string {
|
||||
$candidate = basename($candidate);
|
||||
if ($candidate[0] === '@') {
|
||||
$candidate = substr($candidate, 1);
|
||||
}
|
||||
return $candidate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all possible profile ids for contact
|
||||
*
|
||||
* @param {array} contact information
|
||||
*
|
||||
* @return array of string profile ids
|
||||
*/
|
||||
protected function getProfileIds($contact):array {
|
||||
$socialprofiles = $contact['X-SOCIALPROFILE'];
|
||||
$profileIds = [];
|
||||
if (isset($socialprofiles)) {
|
||||
foreach ($socialprofiles as $profile) {
|
||||
if (strtolower($profile['type']) == $this->name) {
|
||||
$profileIds[] = $this->cleanupId($profile['value']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $profileIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* extracts desired value from an html page
|
||||
*
|
||||
* @param {string} url the target from where to fetch the content
|
||||
* @param {String} the desired catchword to filter for
|
||||
*
|
||||
* @returns {String} the extracted value (first match) or null if not present
|
||||
*/
|
||||
protected function getFromHtml(string $url, string $desired) : ?string {
|
||||
try {
|
||||
$result = $this->httpClient->get($url, [
|
||||
RequestOptions::HEADERS => [
|
||||
// Make the request as google bot so twitter display the full static html page
|
||||
'User-Agent' => 'Googlebot/2.1'
|
||||
]
|
||||
]);
|
||||
|
||||
$htmlResult = new \DOMDocument();
|
||||
$htmlResult->loadHTML($result->getBody());
|
||||
$imgs = $htmlResult->getElementsByTagName('img');
|
||||
foreach ($imgs as $img) {
|
||||
foreach ($img->attributes as $attr) {
|
||||
$value = $attr->nodeValue;
|
||||
if (strpos($value, $desired)) {
|
||||
$value = str_replace('normal', '400x400', $value);
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
} catch (RequestException $e) {
|
||||
$this->logger->debug('Error fetching twitter urls', [
|
||||
'app' => Application::APP_ID,
|
||||
'exception' => $e
|
||||
]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -139,13 +139,13 @@ class TelegramProviderTest extends TestCase {
|
|||
$contactWithoutSocialImgs = [];
|
||||
|
||||
return [
|
||||
'contact with twitter fields' => [
|
||||
'contact with social fields' => [
|
||||
$contactWithSocial,
|
||||
$contactWithSocialHtml,
|
||||
$contactWithSocialUrls,
|
||||
$contactWithSocialImgs
|
||||
],
|
||||
'contact without twitter fields' => [
|
||||
'contact without social fields' => [
|
||||
$contactWithoutSocial,
|
||||
$contactWithoutSocialHtml,
|
||||
$contactWithoutSocialUrls,
|
||||
|
|
|
@ -1,160 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2020 Matthias Heinisch <nextcloud@matthiasheinisch.de>
|
||||
*
|
||||
* @author Matthias Heinisch <nextcloud@matthiasheinisch.de>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCA\Contacts\Service\Social;
|
||||
|
||||
use OCP\Http\Client\IClient;
|
||||
use OCP\Http\Client\IResponse;
|
||||
use OCP\Http\Client\IClientService;
|
||||
use ChristophWurst\Nextcloud\Testing\TestCase;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class TwitterProviderTest extends TestCase {
|
||||
private $provider;
|
||||
|
||||
/** @var IClientService|MockObject */
|
||||
private $clientService;
|
||||
|
||||
/** @var LoggerInterface|MockObject */
|
||||
private $logger;
|
||||
|
||||
/** @var IClient|MockObject */
|
||||
private $client;
|
||||
|
||||
/** @var IResponse|MockObject */
|
||||
private $response;
|
||||
|
||||
protected function setUp(): void {
|
||||
parent::setUp();
|
||||
$this->clientService = $this->createMock(IClientService::class);
|
||||
$this->logger = $this->createMock(LoggerInterface::class);
|
||||
$this->response = $this->createMock(IResponse::class);
|
||||
$this->client = $this->createMock(IClient::class);
|
||||
|
||||
$this->clientService
|
||||
->method('NewClient')
|
||||
->willReturn($this->client);
|
||||
|
||||
$this->provider = new TwitterProvider(
|
||||
$this->clientService,
|
||||
$this->logger
|
||||
);
|
||||
}
|
||||
|
||||
public function dataProviderSupportsContact() {
|
||||
$contactWithSocial = [
|
||||
'X-SOCIALPROFILE' => [
|
||||
['value' => 'username1', 'type' => 'twitter'],
|
||||
['value' => 'username2', 'type' => 'twitter']
|
||||
]
|
||||
];
|
||||
|
||||
$contactWithoutSocial = [
|
||||
'X-SOCIALPROFILE' => [
|
||||
['value' => 'one', 'type' => 'social2'],
|
||||
['value' => 'two', 'type' => 'social1']
|
||||
]
|
||||
];
|
||||
|
||||
return [
|
||||
'contact with twitter fields' => [$contactWithSocial, true],
|
||||
'contact without twitter fields' => [$contactWithoutSocial, false]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderSupportsContact
|
||||
*/
|
||||
public function testSupportsContact($contact, $expected) {
|
||||
$result = $this->provider->supportsContact($contact);
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
public function dataProviderGetImageUrls() {
|
||||
$contactWithSocial = [
|
||||
'X-SOCIALPROFILE' => [
|
||||
['value' => 'https://twitter.com/username1', 'type' => 'twitter'],
|
||||
['value' => 'https://twitter.com/@username2', 'type' => 'twitter']
|
||||
]
|
||||
];
|
||||
$contactWithSocialUrls = [
|
||||
'https://twitter.com/username1',
|
||||
'https://twitter.com/username2',
|
||||
];
|
||||
$contactWithSocialHtml = [
|
||||
'<html><img src="./profile_images/username1_normal.jpg" /></html>',
|
||||
'<html><img src="./profile_images/username2_normal.jpg" /></html>',
|
||||
];
|
||||
$contactWithSocialImgs = [
|
||||
'./profile_images/username1_400x400.jpg',
|
||||
'./profile_images/username2_400x400.jpg'
|
||||
];
|
||||
|
||||
$contactWithoutSocial = [
|
||||
'X-SOCIALPROFILE' => [
|
||||
['value' => 'one', 'type' => 'social2'],
|
||||
['value' => 'two', 'type' => 'social1']
|
||||
]
|
||||
];
|
||||
$contactWithoutSocialUrls = [];
|
||||
$contactWithoutSocialHtml = [];
|
||||
$contactWithoutSocialImgs = [];
|
||||
|
||||
return [
|
||||
'contact with twitter fields' => [
|
||||
$contactWithSocial,
|
||||
$contactWithSocialHtml,
|
||||
$contactWithSocialUrls,
|
||||
$contactWithSocialImgs
|
||||
],
|
||||
'contact without twitter fields' => [
|
||||
$contactWithoutSocial,
|
||||
$contactWithoutSocialHtml,
|
||||
$contactWithoutSocialUrls,
|
||||
$contactWithoutSocialImgs
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderGetImageUrls
|
||||
*/
|
||||
public function testGetImageUrls($contact, $htmls, $urls, $imgs) {
|
||||
if (count($urls)) {
|
||||
$this->response->method('getBody')->willReturnOnConsecutiveCalls(...$htmls);
|
||||
$this->client
|
||||
->expects($this->exactly(count($urls)))
|
||||
->method('get')
|
||||
->withConsecutive(...array_map(function ($a) {
|
||||
return [$a];
|
||||
}, $urls))
|
||||
->willReturn($this->response);
|
||||
}
|
||||
|
||||
|
||||
$result = $this->provider->getImageUrls($contact);
|
||||
$this->assertEquals($imgs, $result);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue