Программная регистрация юзера

Spark108

Проверенные
Сообщения
486
Реакции
950
Баллы
5,675
Есть сайт который я пишу сам, и форум XenForo, нужно сделать добавление пользователей в нужные таблицы MySQL при регистрации на сайте.

Какая функция или класс XenForo отвечает за регистрацию юзера и как применить его вне форума?
 
тебе прийдётся копатся в самом движке Ксюхи. что не есть хорошо.
 
Отснифай регистрацию, и дальше в софте передавай POST данные на соответствующею страницу. При этом ты еще должен парсить капчу и выводить ее пользователю.
 
тебе прийдётся копатся в самом движке Ксюхи. что не есть хорошо.
Можно плагином расширить функцию регистрации

А лучше чтобы не изобретать велосипед посмотреть как сделано в других интеграциях
 
Можно плагином расширить функцию регистрации

А лучше чтобы не изобретать велосипед посмотреть как сделано в других интеграциях

А вот это дельный совет. Я немного разбираюсь в WordPress и phpBB. Для phpBB знаю как сделать такое, но форум не очень хороший в отличии от ксении.

Отснифай регистрацию, и дальше в софте передавай POST данные на соответствующею страницу. При этом ты еще должен парсить капчу и выводить ее пользователю.
Такой вариант не плохой, но не очень будет красиво выводить при регистрации 2 капчи. Ведь у моей реги уже есть капча от гугла.

Но стойте ка. У ксени тоже капча от гугла есть и так думаю что можно просто передать значение из моей капчи ксени.
 
У ксени тоже капча от гугла есть и так думаю что можно просто передать значение из моей капчи ксени.
Так не получится. XF выведет тебе одну капчу, а ты будешь ей передавать совершенно другую. Есть способ гораздо круче, отключить капчу при регистрации в XF (: .
 
Так не получится. XF выведет тебе одну капчу, а ты будешь ей передавать совершенно другую. Есть способ гораздо круче, отключить капчу при регистрации в XF (: .

А вот это можно. Ток куда передовать POST запрос, вот в чом вопрос.

Не стал возится с ксеней и мучить ей, а просто написал небольшую функцию которая сама заносит данные в основные таблицы.
Ну есть конечно грубые ошибки по отношению к ксени, но она все сама исправляет в итоге.
Код:
<?php
function del_char($string, $re = ' '){
    return trim(preg_replace('/(\s{2,})|(\")|(\')/', ' ', $string));
}
function valid_email($email){
    if(preg_match("/^(?:[a-z0-9]+(?:[-_.]?[a-z0-9]+)?@[a-z0-9_.-]+(?:\.?[a-z0-9]+)?\.[a-z]{2,5})$/i",trim($email))) return true; else return false;
}
function user_register_xenforo($userinfo){
    $userinfo = array_merge(
        array(
            'language_id' => '2', // Язык: Русский(2).
            'user_group_id' => '2', // Группа: Зарегестрированные(2).
            'secondary_group_ids' => '',
            'permission_combination_id' => '2',
            'timezone' => 'Europe/Moscow',
        ), $userinfo
    );

    if (
        $userinfo['username'] == '' ||
        $userinfo['email'] == '' ||
        $userinfo['password'] == ''
    ) return false;

    $user_login = del_char($userinfo['username'], '');
    if (valid_email($email)) return false;
    $user_email = $email;
    $lang_id = $userinfo['language_id'];
    $user_group_id = $userinfo['user_group_id'];
    $secondary_group_ids = $userinfo['secondary_group_ids'];
    $permission_combination_id = $userinfo['permission_combination_id'];
    $password_hash = 'a:1:{s:4:"hash";s:60:"'.password_hash($userinfo['password'], PASSWORD_DEFAULT).'";}';
    $dob_day = $userinfo['dob_day'];
    $dob_month = $userinfo['dob_month'];
    $dob_year = $userinfo['dob_year'];
    $timezone = $userinfo['timezone'];

    $is_user_row = mysql_query("SELECT COUNT(user_id) FROM `xf_user` WHERE `username`='$user_login'");
    $is_user = mysql_fetch_array($is_user_row);
    if ($is_user[0] != '0') return false;

    mysql_query("INSERT INTO `xf_user`(`username`, `email`, `language_id`, `timezone`, `user_group_id`, `secondary_group_ids`, `permission_combination_id`) VALUES ('$user_login','$user_email','$lang_id', '$timezone', '$user_group_id', '$secondary_group_ids', '$permission_combination_id')");

    $mysql = mysql_query("SELECT `user_id` FROM `xf_user` WHERE `username`='$user_login'");
    $user_id_row = mysql_fetch_array($mysql);
    $user_id = $user_id_row[0];

    mysql_query("INSERT INTO `xf_user_authenticate`(`user_id`,`scheme_class`,`data`,`remember_key`) VALUES ('$user_id', 'XenForo_Authentication_PhpBb3', '$password_hash','0')");
    mysql_query("INSERT INTO `xf_user_option`(`user_id`) VALUES ('$user_id')");
    mysql_query("INSERT INTO `xf_user_privacy`(`user_id`) VALUES ('$user_id')");
    mysql_query("INSERT INTO `xf_user_profile`(`user_id`, `dob_day`, `dob_month`, `dob_year`) VALUES ('$user_id', '$dob_day', '$dob_month', '$dob_year')");

    return true;
}

$userinfo = array(
    'username' => 'user',
    'email' => '[email protected]',
    'password' => '123456789',
    'dob_day' => '22',
    'dob_month' => '02',
    'dob_year' => '2016',
);
mysql_connect('localhost','123123','1231231');
mysql_select_db('124312341');

if(user_register_xenforo($userinfo)) echo '1'; else echo '0';
?>
Это начальный код, щас начну его рассматривать, коментировать строчки (Ибо редко это делаю), добавлять проверки и тд. ну и исправлять жестокие ошибки.
Код рабочий. После его выполнения стал доступен юзер "user" с паролем "123456789".
Думаю сделать небольшую библиотеку для таких же кто хочет сделать регу в ксени используя свой скрипт авторизации.

Готово.
 

Вложения

  • libXenForo.zip
    5.4 KB · Просмотры: 2
Последнее редактирование:
А вот это можно. Ток куда передовать POST запрос, вот в чом вопрос.

Не стал возится с ксеней и мучить ей, а просто написал небольшую функцию которая сама заносит данные в основные таблицы.
Ну есть конечно грубые ошибки по отношению к ксени, но она все сама исправляет в итоге.
Код:
<?php
function del_char($string, $re = ' '){
    return trim(preg_replace('/(\s{2,})|(\")|(\')/', ' ', $string));
}
function valid_email($email){
    if(preg_match("/^(?:[a-z0-9]+(?:[-_.]?[a-z0-9]+)?@[a-z0-9_.-]+(?:\.?[a-z0-9]+)?\.[a-z]{2,5})$/i",trim($email))) return true; else return false;
}
function user_register_xenforo($userinfo){
    $userinfo = array_merge(
        array(
            'language_id' => '2', // Язык: Русский(2).
            'user_group_id' => '2', // Группа: Зарегестрированные(2).
            'secondary_group_ids' => '',
            'permission_combination_id' => '2',
            'timezone' => 'Europe/Moscow',
        ), $userinfo
    );

    if (
        $userinfo['username'] == '' ||
        $userinfo['email'] == '' ||
        $userinfo['password'] == ''
    ) return false;

    $user_login = del_char($userinfo['username'], '');
    if (valid_email($email)) return false;
    $user_email = $email;
    $lang_id = $userinfo['language_id'];
    $user_group_id = $userinfo['user_group_id'];
    $secondary_group_ids = $userinfo['secondary_group_ids'];
    $permission_combination_id = $userinfo['permission_combination_id'];
    $password_hash = 'a:1:{s:4:"hash";s:60:"'.password_hash($userinfo['password'], PASSWORD_DEFAULT).'";}';
    $dob_day = $userinfo['dob_day'];
    $dob_month = $userinfo['dob_month'];
    $dob_year = $userinfo['dob_year'];
    $timezone = $userinfo['timezone'];

    $is_user_row = mysql_query("SELECT COUNT(user_id) FROM `xf_user` WHERE `username`='$user_login'");
    $is_user = mysql_fetch_array($is_user_row);
    if ($is_user[0] != '0') return false;

    mysql_query("INSERT INTO `xf_user`(`username`, `email`, `language_id`, `timezone`, `user_group_id`, `secondary_group_ids`, `permission_combination_id`) VALUES ('$user_login','$user_email','$lang_id', '$timezone', '$user_group_id', '$secondary_group_ids', '$permission_combination_id')");

    $mysql = mysql_query("SELECT `user_id` FROM `xf_user` WHERE `username`='$user_login'");
    $user_id_row = mysql_fetch_array($mysql);
    $user_id = $user_id_row[0];

    mysql_query("INSERT INTO `xf_user_authenticate`(`user_id`,`scheme_class`,`data`,`remember_key`) VALUES ('$user_id', 'XenForo_Authentication_PhpBb3', '$password_hash','0')");
    mysql_query("INSERT INTO `xf_user_option`(`user_id`) VALUES ('$user_id')");
    mysql_query("INSERT INTO `xf_user_privacy`(`user_id`) VALUES ('$user_id')");
    mysql_query("INSERT INTO `xf_user_profile`(`user_id`, `dob_day`, `dob_month`, `dob_year`) VALUES ('$user_id', '$dob_day', '$dob_month', '$dob_year')");

    return true;
}

$userinfo = array(
    'username' => 'user',
    'email' => '[email protected]',
    'password' => '123456789',
    'dob_day' => '22',
    'dob_month' => '02',
    'dob_year' => '2016',
);
mysql_connect('localhost','123123','1231231');
mysql_select_db('124312341');

if(user_register_xenforo($userinfo)) echo '1'; else echo '0';
?>
Это начальный код, щас начну его рассматривать, коментировать строчки (Ибо редко это делаю), добавлять проверки и тд. ну и исправлять жестокие ошибки.
Код рабочий. После его выполнения стал доступен юзер "user" с паролем "123456789".
Думаю сделать небольшую библиотеку для таких же кто хочет сделать регу в ксени используя свой скрипт авторизации.

Готово.
4d16c26a.png
Вот все данные которые идут при посте, (POST идет сюда ). Самое сложное, наверное, это спарсить reg_key. Все остальное вроде как можно подставить одинаково.
Код:
username=&2be4c5f0de845340239ce47982b949aa=Vlad&68a36a6cc566250b15c26752d08ee9b5=mail%40mail.ru&69f076c01c3866c4bd47030ad6711fca=123&c4db848d4070d48ec2c5f0ee79d9b8be=123&56c96e11fff35fba2798464c41e8702b=&32511f483d3c587a7fb268d6bd184cf0=male&dob_month=2&dob_day=1&dob_year=1997&5ca38b4992fde286573867cd6afd66da=Europe%2FMoscow&agree=1&_xfToken=&reg_key=c00313db20407f9af4e614c1c69f0407
 
Постите что вклиниваюсь. Тоже пытаюсь делать регу через БД. Вопрос наверно смешной - что делает reg_key ? И какимс способом его сгенерить?
 
Прям так трудно спарсить ага, движок наверное весь закодированный.
$this->uniqueKey = \XF::generateRandomString(16);
PHP:
   /**
     * Generates a psuedo-random string of the specified length.
     *
     * @param integer $length
     * @param boolean $raw If true, raw binary is returned, otherwise modified base64
     *
     * @return string
     */
    public static function generateRandomString($length, $raw = false)
    {
        if ($raw)
        {
            return \XF\Util\Random::getRandomBytes($length);
        }
        else
        {
            return \XF\Util\Random::getRandomString($length);
        }
    }
PHP:
public static function getRandomBytes($length)
    {
        if (self::$sources === null)
        {
            self::$sources = self::getAvailableSources();
        }

        $length = intval($length);
        if ($length < 1)
        {
            throw new \LogicException("Must fetch 1 or more random bytes");
        }

        $output = '';
        $remaining = $length;
        $lastUsed = null;

        foreach (self::$sources AS $type => $fn)
        {
            $result = self::$fn($remaining);
            if (is_string($result) && $added = strlen($result))
            {
                $lastUsed = $type;

                $output .= $result;
                $remaining -= $added;
                if ($remaining <= 0)
                {
                    break;
                }
            }
        }

        if (strlen($output) < $length)
        {
            throw new \ErrorException("Could not generate random bytes of significant length");
        }

        self::$lastUsed = $lastUsed;

        return substr($output, 0, $length);
    }

    public static function getRandomString($length)
    {
        $random = self::getRandomBytes($length);
        $string = strtr(base64_encode($random), [
            '=' => '',
            "\r" => '',
            "\n" => '',
            '+' => '-',
            '/' => '_'
        ]);

        return substr($string, 0, $length);
    }
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу