Пример Tinyurl API - правильно ли я делаю: D

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

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

Я обновил код, но теперь URL никогда не преобразуется. Тинюрл действительно такой медленный или я что-то не так делаю? (Я имею в виду, эй, 5 секунд - это много в наше время)

Может ли кто-нибудь порекомендовать мне более надежный сервис?

Все моя вина, забыл фальшивку в фопене. Но я оставлю этот пример кода здесь, потому что я часто вижу этот пример, который, как мне кажется, работает не очень надежно:

return file_get_contents('http://tinyurl.com/api-create.php?url='.$u);

Это, я думаю, полностью рабочий образец. Я хотел бы услышать об улучшениях.

static function gettinyurl( $url ) {

    $context =
        stream_context_create(
            array(
                'http' => array(
                    'timeout' => 5  // 5 Seconds should be enough
                )
            )
        );

    // get tiny url via api-create.php
    $fp = fopen( 'http://tinyurl.com/api-create.php?url='.$url, 'r', $context); // open (read) api-create.php with long url as get parameter

    if( $fp ) { // check if open was ok
        $tinyurl = fgets( $fp ); // read response

        if( $tinyurl && !empty($tinyurl) ) // check if response is ok
            $url = $tinyurl; // set response as url

        fclose( $fp ); // close connection
    }

    // return
    return $url; // return (tiny) url

}


person Paul Weber    schedule 12.01.2010    source источник


Ответы (5)


Вы можете использовать urlencode() для параметра url.

Также рекомендуется проверить fgets() против false. Затем вы можете сохранить вызов функции empty(), просто сравнив ответ с пустой строкой, например:

$line = fgets($fp);

if ($line !== false && $line !== '') {
    // ...
}

Как правило, рекомендуется сначала проверить все на false, если функция возвращает значения разных типов, например integer или boolean. Это может иметь решающее значение, потому что 0 и false при сравнении означают одно и то же. Из-за отсутствия в PHP безопасности типов настоятельно рекомендуется всегда проверять равенство типов. Есть даже случаи, когда документация прямо рекомендует это, например. в случае strpos(). Между тем, я заставил себя использовать === вместо ==, то же самое для `!=' и т. д. Это требует больше ввода, но это определенно стоит усилий, потому что вы устраняете возможные ловушки.

Остальная часть вашего кода выглядит хорошо для меня.

person user206268    schedule 31.03.2010

Вы можете попробовать сервис bit.ly. Он поддерживается Google, как я знаю.

API

person antyrat    schedule 12.01.2010

Я не знаю точно, какой длины ваш хеш, но не все службы (браузеры, серверы и т. д.) могут обрабатывать URL-адреса длиннее 255 символов. Вы можете изучить php's Pack()< /а>

person Thom Wiggers    schedule 12.01.2010

Какой смысл использовать «сверхдлинный хэш», если вы сразу укорачиваете его до 7-8-символьного тиниурла?

Никто не стал бы угадывать длинный хеш и вместо этого взломал бы тиниурл.

Используйте 10-символьный хэш самостоятельно и обезопасьте себя более, чем сейчас.

person Joel L    schedule 03.04.2010
comment
Ну... то, как выглядит Хэш, не в моем домене. Мне просто нужно отправить рабочее электронное письмо с включенным в него хэшем. Намерение разработчика состояло в том, чтобы скрыть некоторую информацию в хэше, чтобы мы могли восстановить, какой пользователь хотел зарегистрироваться и т. д. Существует также компонент, который зашифрован, поэтому, пока никто не узнает ключ, наши хэши довольно хороши. безопасный. И я не уверен, правильно ли я вас понял, но почему Тинюрл должно быть легче или сложнее взломать? - person Paul Weber; 06.04.2010
comment
Что касается тиниурла, который легче взломать — если у них есть только 10-символьный ключ, следующий шаблону, то угадать URL-адреса (и проверить, перенаправляют ли они на ваш домен) будет намного проще, чем угадать длинный хэш. Но учитывая, что сами длинные URL-адреса не находятся под вашим контролем — извините за путаницу... :) - person Joel L; 06.04.2010

Вот еще версия:

function getTinyUrl($url)
{
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL,'http://' . 'tinyurl.com/api-create.php?url=' . $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $tinyUrl = curl_exec($ch);
    curl_close($ch);
    
    if ($tinyUrl === false) {
        throw new RuntimeException("Could not create URL");
    }
    
    return $tinyUrl;
}

Мне пришлось разделить URL-адрес tinyurl, потому что SO не позволил мне опубликовать ответ.

person Ruben Estrada    schedule 08.04.2021