How to target block variations with has_block()?

We can try to use has_block(), has_blocks() and parse_blocks() to find an embed with a given providerNameSlug attribute.

Untested suggestion:

function has_block_embed_by_provider_wpse( $provider, $post = null ) {
    if ( ! has_blocks( $post ) ) {
        return false;
    }
 
    if ( ! is_string( $post ) ) {
        $wp_post = get_post( $post );
        if ( $wp_post instanceof WP_Post ) {
            $post = $wp_post->post_content;
        }
    }
   
    if ( has_block ( 'embed', $post ) ) {
        $blocks = parse_blocks ( $post );
        foreach( (array) $blocks as $block ) {
            if ( isset( $block['attrs']['providerNameSlug'] ) 
                 && $provider === $block['attrs']['providerNameSlug'] 
            ) {
                return true;
            }
        }
    }
    return false;
}

Usage Examples:

has_block_embed_by_provider_wpse( 'vimeo' )

has_block_embed_by_provider_wpse( 'vimeo', $content )

has_block_embed_by_provider_wpse( 'vimeo', $post )

has_block_embed_by_provider_wpse( 'vimeo', 123 )

has_block_embed_by_provider_wpse( 'vimeo', get_post( 123 ) )