Automatizando convite em massa

Olá a todos,

Eu estava procurando por um recurso de API que, para um determinado endereço de e-mail, adicionasse um usuário a um ou dois grupos, convidando-o para o fórum caso ainda não tivesse uma conta. Não consegui encontrar esse recurso, mas notei que é exatamente isso que o recurso de convite de “upload em massa” faz. Isso não está documentado na API, mas é o que o navegador faz.

Então fiz o mesmo, usando o seguinte código PHP para enviar um arquivo CSV via POST:

        $body = "--ossifrage\r
Content-Disposition: form-data; name=\"type\"\r
\r
csv\r
--ossifrage\r
Content-Disposition: form-data; name=\"files[]\"; filename=\"test.csv\"\r
Content-Type: text/csv\r
\r
$order_email,$group_names\r
\r
\r
--ossifrage--\r
";
$r=wp_remote_post( 'https://club.tidalcycles.org/invites/upload_csv.json', array(
                    'method' => 'POST',
                    'headers' => array('Content-Type' => 'multipart/form-data; boundary=ossifrage', 
                                       'Api-key' => '(redacted)',
                                       'Api-Username' => 'yaxu'),
                    'body' => $body
                    )
                 ); 

Isso funcionou muito bem por alguns meses, mas recentemente parou de funcionar, com o seguinte erro nos logs do Discourse: Can't verify CSRF token authenticity.

Isso é um bug, já que eu deveria estar autenticado via chave de API? Ou estou seguindo um caminho sem saída ao tentar usar partes não documentadas da API?

Só queria saber se alguém pode confirmar se isso é um bug que provavelmente será corrigido ou não? De qualquer forma, vou começar a procurar uma solução alternativa.

Alguma ideia sobre isso, @techAPJ?

Olá, obrigado por dar uma olhada. Consegui juntar algo com a API documentada (com ênfase em ‘juntar’, mas talvez isso seja útil para outra pessoa):

function tidal_process_order( $order_id ){
        $order = new WC_Order($order_id);
        $order_email = $order->get_billing_email();
        $group_names_arr = [];
        // obter SKUs como nomes de grupos
        foreach ( $order->get_items() as $item ) {
          if ( $item['product_id'] > 0 ) {
            $_product = $item->get_product();
            $sku = $_product->get_sku();
            array_push($group_names_arr, $sku);
          }
        }

        $group_names = join(",",$group_names_arr);

        // verificar se o usuário do Discourse já existe com o e-mail
        $r=wp_remote_get( "https://club.tidalcycles.org/admin/users/list/all.json?email=$order_email", array(
                          'headers' => array('Api-key' => 'redacted',
                                             'Api-Username' => 'redacted')
                                            )
                        );
        $matches = json_decode($r['body']);
        if (count($matches) > 0) {
          // usuário existe, adicionar aos grupos
          $user_id = $matches[0]->id;
          foreach($group_names_arr as $group) {
            // obter ID do grupo pelo nome do grupo
            $r=wp_remote_get( "https://club.tidalcycles.org/groups/$group.json", array(
                              'headers' => array('Api-key' => 'redacted',
                                                 'Api-Username' => 'redacted')
                              )
                            );
            $group = json_decode($r['body']);
            $body = json_encode(array('group_id' => $group->group->id));
            // adicionar usuário ao grupo
            $r=wp_remote_post( "https://club.tidalcycles.org/admin/users/$user_id/groups", array(
                               'headers' => array('Api-key' => 'redacted',
                                                  'Api-Username' => 'redacted',
                                                  'Content-Type' => 'application/json', 
                                                 ),
                               'body' => $body
                            ));
          }
        }
        else {
            // usuário não existe, convidar com os nomes dos grupos
            $body = json_encode(array('email' => $order_email, 'group_names' => $group_names, "custom_message" => "Bem-vindo!"));
            $r=wp_remote_post( "https://club.tidalcycles.org/invites", array(
                               'headers' => array('Api-key' => 'redacted',
                                                  'Api-Username' => 'redacted',
                                                  'Content-Type' => 'application/json', 
                                                 ),
                               'body' => $body
                            ));
        };
}

add_action( 'woocommerce_order_status_processing', 'tidal_process_order' );