Automatización de invitaciones masivas

Hola a todos,
Buscaba una función de API que, dada una dirección de correo electrónico, añadiera a un usuario a uno o dos grupos e lo invitara al foro si aún no tenía cuenta. No pude encontrar esa función, pero noté que esto es exactamente lo que hace la función de invitación por ‘carga masiva’. Esto no está documentado en la API, pero es lo que hace el navegador.

Así que hice lo mismo, utilizando el siguiente código PHP para enviar un archivo CSV mediante 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
                    )
                 ); 

Esto funcionó perfectamente durante un par de meses, pero recientemente dejó de funcionar, mostrando el siguiente error en los registros de Discourse: Can't verify CSRF token authenticity.

¿Es esto un error, ya que debería estar autenticado mediante la clave de API? ¿O estoy intentando algo inútil al usar partes no documentadas de la API?

Solo me preguntaba si alguien podría confirmar si esto es un error que probablemente se solucionará o no. De todos modos, empezaré a buscar una solución alternativa.

¿Alguna idea sobre esto, @techAPJ?

Hola, gracias por mirar. Logré armar algo con la API documentada (con énfasis en armar, pero quizás esto sea útil para alguien más):

function tidal_process_order( $order_id ){
        $order = new WC_Order($order_id);
        $order_email = $order->get_billing_email();
        $group_names_arr = [];
        // obtener skus como nombres de grupo
        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 si el usuario de discourse ya existe con el correo
        $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) {
          // el usuario existe, agrégalo a los grupos
          $user_id = $matches[0]->id;
          foreach($group_names_arr as $group) {
            // obtener el id del grupo a partir del nombre del 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));
            // agregar usuario al 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 {
            // el usuario no existe, invítalo con los nombres de grupo
            $body = json_encode(array('email' => $order_email, 'group_names' => $group_names, "custom_message" => "¡Bienvenido!"));
            $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' );